热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:第五节:SignalR大杂烩(与MVC融合全局的几个配置跨域的应用C/S程序充当Client和Server)

本文由编程笔记#小编为大家整理,主要介绍了第五节:SignalR大杂烩(与MVC融合全局的几个配置跨域的应用C/S程序充当Client和Server)相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了第五节:SignalR大杂烩(与MVC融合全局的几个配置跨域的应用C/S程序充当Client和Server)相关的知识,希望对你有一定的参考价值。

一. 说在前面的话

  本节主要在前面章节的基础上补充了几个简单的知识点,比如:第三方调用通过 GlobalHost.ConnectionManager.GetHubContext();来获取Hub对象,那么能不能封装一下不必每次都这么获取呢?再比如SignalR传输是否有大小限制,一下传输10w个字能否传输成功?最后着重整理一下跨域的各种使用情况,结合C/S程序充当客户端和服务器端。

  本节内容包括:

    ①. SignalR与MVC或者WebApi简单的整合。

    ②. 全局的几个配置。

    ③. 跨域的配置和应用。

    ④. C/S程序充当客户端或服务器端。

 

二. SignalR与MVC的简单整合

   在前面的章节中我们已经知道,如果要通过控制器中的Action来实现通讯,需要通过 GlobalHost.ConnectionManager.GetHubContext(); 来获取Hub类,但是每个Action中都这么获取,显得有点麻烦,这里简单封装一下,来便捷开发。

    分析:实质在我们在Action中用到的对象无非也就这两个,IHubConnectionContext Clients  和  IGroupManager Groups ,所以这里利用继承的关系简单的封装一下,声明BaseController类,在里面获取这两个对象,然后其它控制器继承BaseController,并传入对应的Hub类,这样在Action中就可以直接使用 Clients和Groups了。

  PS:WepAPI程序可以采用下面类似方式进行封装。

  BaseController代码展示:

1 ///


2 /// 整合MVC和SignalR
3 ///

4 public class BaseController : Controller where T : Hub
5 {
6 public IHubConnectionContext<dynamic> Clients { get; set; }
7
8 public IGroupManager Groups { get; set; }
9
10 public BaseController()
11 {
12 var hub = GlobalHost.ConnectionManager.GetHubContext();
13 Clients = hub.Clients;
14 Groups = hub.Groups;
15 }
16 }

  继承BaseController的代码展示:

1 public class HubController : BaseController
2 {
3
4 ///


5 /// 向所有人发送消息
6 ///

7 /// 当前用户的登录标记
8 /// 发送的信息
9 public string MySendAll(string myConnectionId, string msg)
10 {
11 //Hub模式
12 Clients.AllExcept(myConnectionId).receiveMsg($"用户【{myConnectionId}】发来消息:{msg}");
13 return "ok";
14 }
15
16 }

   

三. 全局的几个配置

   这里的全局配置主要包括:传输超时时间、强制关闭时间、WebSocket模式下允许传输的数据最大值等等,以下配置代码可以在Configuration方法中进行配置,可以根据实际业务情况自行选择配置。

  1. 表示客户端在转而使用其他传输或连接失败之前应允许连接的时间。默认值为 5 秒。(传输超时时间)

    GlobalHost.Configuration.TransportCOnnectTimeout= TimeSpan.FromSeconds(5);

  2. 表示连接在超时之前保持打开状态的时间

    GlobalHost.Configuration.TransportCOnnectTimeout= TimeSpan.FromSeconds(5);

  3. 用于表示在连接停止之后引发断开连接事件之前要等待的时间。 (强制关闭时间)

    GlobalHost.Configuration.DiscOnnectTimeout= TimeSpan.FromSeconds(5);

  4. 表示两次发送保持活动消息之间的时间长度。如果启用,此值必须至少为两秒。设置为 null 可禁用。

    GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(2);

  5. Websocket模式下允许传输数据的最大值,默认为64kb

    GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = 64;

 

四. 跨域的应用

   在很多情况下,前后端是分离,客户端和服务器端并不在一个地址下,比如APP(这里指混合开发能使用JS的情况下),这个时候服务器的SignalR就需要配置允许跨域,这里有两种允许跨域的策略,一种是JSONP模式,另外一种是Cors模式。

  在Startup类中的Configuration方法中进行配置,代码如下

1 public class Startup
2 {
3 public void Configuration(IAppBuilder app)
4 {
5 //配置允许跨域
6 //1. JSONP模式
7 //app.MapSignalR(new HubConfiguration() { EnableJSOnP= true });
8
9 //2. Cors模式(需要安装Microsoft.Owin.Cors程序集)
10 app.UseCors(CorsOptions.AllowAll).MapSignalR();
11 }
12 }

  注:采用Cors模式的跨域需要安装:Microsoft.Owin.Cors 程序集,并且上述代码没有单独配置模型路径,所以采用的是默认路径“/signalr”。

  当然前端代码也需要进行相应的改写:

(1). 代理模式的改写形式:

   a. 自动生成代理类代码需要改写为  ,localhost:7080,根据实际情况改为实际地址。

      b. 需要单独配置一下Hub的连接路径, conn.url = "http://localhost:7080/signalr";

 以上两步即为全部改变,其余位置不需变化。

技术分享图片

(2). 非代理模式下的代码:

   非代理模式下就更容易,只需要在hubConnection方法中传入路径即可。如下图:

技术分享图片

 

五. C/S程序充当客户端

   C/S程序(这里采用控制台)充当客户端,当然服务器端必须已经配置了允许跨域,且C/S程序是没有JS的,所以只能采用非代理模式。

 步骤如下:

  1:安装程序集 Microsoft.AspNet.SignalR.Client

  2:代码配置

    a. 与服务器路径匹配的时候要注意,默认路径的话,要加上signalr/

    b. 如果定义的方法大于一个参数的时候,需要声明一个类来接收

    eg:Proxy.On("方法名", Person=>

      Console.WriteLine("ID{0} Name{1}", Person.ID, Person.Name));

 代码如下:

1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 //一. 基础信息配置
7 //1. 与服务器路径进行匹配
8 var cOnn= new HubConnection("http://localhost:8099/signalr/");
9 //2. 创建代理类
10 var proxy = conn.CreateHubProxy("MySpecHub1");
11
12
13 //二. 定义客户端的方法
14 //特别注意,如果定义的方法大于一个参数的时候,msg的位置需要声明一个类来接受
15 //1 接受用户登录成功后的提示
16
17 proxy.On("LoginSuccessNotice", (msg) =>
18 {
19 Console.WriteLine(msg);
20 });
21
22 //2 接收自己的connectionId
23 proxy.On("ReceiveOwnCid", (msg) =>
24 {
25 Console.WriteLine(msg);
26 });
27
28 //三. 启动
29 conn.Start().Wait();
30
31 Console.ReadKey();
32
33 }
34 }

 

六. C/S程序充当服务器端

   在很多情况下,我们需要避免使用IIS的性能开销,或者要将SignalR部署成Windows服务,这个使用就需要使用C/S程序作为服务器端了。

 配置步骤比较简单,如下: 

1. 安装程序集:Microsoft.AspNet.SignalR.SelfHost 和 Microsoft.Owin.Cors(跨域使用)

2. 添加集线器类MySpecHub1

3. 在Startup中配置允许跨域

4. 编写启动代码

 PS:以上步骤2和步骤3在前面章节中已经多次提到过了,这里指展示一下启动代码:

1 static void Main(string[] args)
2 {
3 try
4 {
5 string url = "http://localhost:7080";
6 using (WebApp.Start(url))
7 {
8 Console.WriteLine("Server running on {0}", url);
9 Console.ReadLine();
10 }
11 }
12 catch (Exception ex)
13 {
14 Console.WriteLine(ex.Message);
15 }
16 Console.ReadKey();
17 }

  特别注意:如果报System.Reflection.TargetInvocationException was unhandled,直接去bin文件里以管理员身份运行exe程序即可或者以管理员身份运行VS程序然后启动即可。

 

 

 


!




  • 作       者 : Yaopengfei(姚鹏飞)

  • 博客地址 : http://www.cnblogs.com/yaopengfei/

  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。

  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。



 


推荐阅读
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
手机用户2502895987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有