Asp.net Mvc WebSocket
转载一种仿照Asp.net Mvc思维构建WebSocket服务器的方法
问题场景
Asp.net Mvc提供了DependencyResolver、Routing、Filter、 Modelbinder等webForm所没有新概念,提高Web服务编写的便利性,记得很久之前写的ashx处理程序,由于没有Routing和Modelbinder,代码里写了很多switch case,还有很多参数类型转换,写得满头大汗。现在,开发WebSocket服务端时,同样遇到和ashx差不多的状况:解析数据包,分析Command值,switch(command),然后一个case一个case分支的服务逻辑实现。
优化思路
如果我们在webSocket协议之上提出一种请求和回复的数据包的格式约定,正如http在tcp之上的协议约定一样,那么就可以仿照Asp.net Mvc一样,实现服务端的DependencyResolver、Controller、Filter等类似功能,未来业务功能的开发只要继承Controller即可,轻松地实现业务功能代码和基础通讯代码完全分开。当然这个格式约定可以作很简单化,而不是直接复制Http协议,我们现在约定的格式可以如下:
{"api":"Login","id":2,"body":["name","password"]}
- 请求和回复的内容都为Json文本;
- api指明请求到远程端的哪个api方法;
- id为本数据包的唯一标识符;
- body为请求的远程端api的参数值,为数组;如果是回复,则为回复的对象的json文本
客户端请求如上的数据到服务器,服务器就自行调用它里面的Login方法,然后将返回值放到请求json的body字段返回给客户端:
public bool Login(string theName, string thePassword)
{
return theName == "name" && thePassword == "password";
}
设计之道
Api服务基础类(FastApiService)的设计
上面的Login方法是一个具体的业务Api,其所在的class派生于FastApiService,FastApiService的职责是反射调用其Login成员方法。
关于反射性能,可以对Login方法先生成一个调用的委托,缓存起来供下次调用,可以参考asp.net Mvc的ActionMethodDispatcher:http://www.projky.com/asp.netmvc/4.0/System/Web/Mvc/ActionMethodDispatcher.cs.html
FastApiService的职责接口如下:
/// <summary>
/// 定义Api服务的执行
/// </summary>
public interface IFastApiService : IDisposable
{
/// <summary>
/// 执行Api行为
/// </summary>
/// <param name="actionContext">Api行为上下文</param>
void Execute(ActionContext actionContext);
}
Routing的设计
这里我们偷工减料了,不作那么强大,分析请求数据包的api键的字符串值,查找哪个FastApiService定义了相关的成员方法,从而New出这个FastApiService实例,再调用Execute(ActionContext actionContext);
DependencyResolver的设计
Asp.netMvc+Autofac管理EF的Context对象非常方便,这得利于Asp.netMvc提供了DependencyResolver,可以把Controller的创建给IOC组件来管理,DependencyResolver接口很简单,传入对象类型,返回对象实例,中间过程由IOC来处理。
查找哪个FastApiService定义了相关的成员方法,从而New出这个FastApiService实例
这里获取FastApiService的实例,改为DependencyResolver来获取
各部件执行流程
Filter哪里去了
Filter实际是附属的一种东西,在FastApiService的Execute前和后各执行各种Filter就可以了,不管是全局的Filter,还是打特性的,终究都是Filter,约定好他们的执行顺序就OK!有了Filter,妈妈再也不担心别人还未登录就请求我的其它Api服务了。
成果展示
服务器c#代码片断
/// <summary>
/// Cpu性能检测控制服务
/// </summary>
public class CpuCounterService : FastApiService
{
/// <summary>
/// 获取版本号
/// </summary>
/// <returns></returns>
[Api]
[LogFilter("获取版本号")]
public string GetVersion()
{
return this.GetType().Assembly.GetName().Version.ToString();
} /// <summary>
/// 订阅/取消Cpu变化通知
/// </summary>
/// <returns></returns>
[Api]
[LogFilter("订阅/取消Cpu变化通知")]
public bool SubscribeCpuChangeNotify(bool subscribe)
{
this.CurrentContext.Session.TagData.Set("NotifyFlag", subscribe);
return true;
}
}
客户端js代码片断
document.title = '正在连接到服务器 ..';
var ws = new fastWebSocket('ws://localhost:8282/'); // 注册api
ws.bindApi("CpuTimeChanged", function (data) {
lineChart.addData(data);
}); ws.onclose = function (e) {
document.title = '连接已断开:' + e.code + '' + e.reason;
}; ws.onopen = function (e) {
ws.invkeApi('getVersion', [], function (version) {
document.title = '服务器版本号:' + version;
}, function (ex) {
alert('异常:' + ex);
});
};
栗子下载
Asp.net Mvc WebSocket的更多相关文章
- 一种仿照Asp.net Mvc思维构建WebSocket服务器的方法
问题场景 Asp.net Mvc提供了DependencyResolver.Routing.Filter. Modelbinder等webForm所没有新概念,提高Web服务编写的便利性,记得很久之前 ...
- 最新 .NET Core 中 WebSocket的使用 在Asp.Net MVC 中 WebSocket的使用 .NET Core 中 SignalR的使用
ASP.NET MVC 中使用WebSocket 笔记 1.采用控制器的方法 这个只写建立链接的方法的核心方法 1.1 踩坑 网上都是直接 传个异步方法 直接接受链接 自己尝试了好多次链接是打开的,到 ...
- 使用 WPF+ ASP.NET MVC 开发 在线客服系统 (一)
近段时间利用业余时间开发了一套在线客服系统,期间遇到过大大小小不少问题,好在都一一解决,最终效果也还可以,打算写一个系列的文章把开发过程详细的记录下来. 希望能够和更多的开发人员互相交流学习,也希望有 ...
- ASP.NET MVC随想录——漫谈OWIN
什么是OWIN OWIN是Open Web Server Interface for .NET的首字母缩写,他的定义如下: OWIN在.NET Web Servers与Web Application之 ...
- 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性
[索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...
- ASP.NET MVC SignalR(1):背景
系列目录:ASP.NET MVC SignalR 关键词:HTTP.轮询.WebSocket.Server-Sent Events.长轮询.forever frame. 1. HTTP HTTP(Hy ...
- Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏
SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏 1.1.1 摘要 今天,我们将使用SignalR + KnockoutJS + ASP.NET MVC实现一个实 ...
随机推荐
- 取缔Chrome装载电脑管家的广告过滤脚本代码
今天Chrome调试脚本.加载在下面的脚本中找到的内容: /* 电脑管家chrome 广告过滤 */ var GJAD_CS = { elemhideElt : null, setElemhideCS ...
- mvc+webapi+dapper+ef codefirst项目搭建
首先项目是mvc5+webapi2.0+orm数据处理(dapper)+ef动态创建数据库. 1.项目框架层次结构: mvc项目根据不同的业务和功能进行不同的区域划分[今后项目维护起来方便],mode ...
- OAuth在WebApi
OAuth在WebApi中的使用,前后台分离的调用方式 前段时间由于公司架构服务层向WebApi转换,就研究了OAuth在WebApi中的使用,这中间遇到了很多坑,在此记录一下OAuth的正确使用方式 ...
- 【原创】构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)
原文:[原创]构建高性能ASP.NET站点之一 剖析页面的处理过程(前端) 构建高性能ASP.NET站点之一 剖析页面的处理过程(前端) 前言:在对ASP.NET网站进行优化的时候,往往不是只是懂得A ...
- UVA 847 - A Multiplication Game(游戏)
UVA 847 - A Multiplication Game 题目链接 题意:一个数一開始是1,每次轮流乘2-9,谁先大于n谁就赢,问谁胜 思路:博弈,找出必胜态.2-9为stan,10-18为ol ...
- LINQ之路(1):LINQ基础
本文将从什么是LINQ(What).为什么使用LINQ(Why)以及如何使用LINQ(How)三个方面来进行说明. 1.什么是LINQ LINQ(Language Integrated Query)是 ...
- OSChina 的URL类的源代码重写过程
此代码是 oschina 到手柄形状像 http://www.oschina.net/p/tomcat 这种URL 此类已经废弃,改用 http://www.oschina.net/code/snip ...
- Canvas rontate(旋转) 使用误区
context.setTransform(1,0,0,1,0,0);//重置转换为初始化状态 var angleInRadians = 45 * Math.PI / 180;var width = 4 ...
- Entity Framework笔记(二)
前几日学习了在VS2010Console项目中使用Entity Framework,并且使用Code First模式.通过编写Model类,来生成数据库对应的表.并且,往表中写入数据以及获取表中的所有 ...
- Codeforces 439C Devu and Partitioning of the Array(模拟)
题目链接:Codeforces 439C Devu and Partitioning of the Array 题目大意:给出n个数,要分成k份,每份有若干个数,可是仅仅须要关注该份的和为奇数还是偶数 ...