从现在开始相关文章请到: http://lko2o.com/moon

接着上一篇:《ASP.NET SignalR系列》第三课 SignalR的支持平台

一、概述

  SignalR常常依托于ASP.NET应用程序运行于IIS中,但它还可以自我托管(比如作为console winform、Windows service).只要我们使用self-host库就可以了.

该库向所有的SignalR 2库一样,构建于OWIN (Open Web Interface for .NET).OWIN定义了一个在.NET web 服务端和web 应用程序的抽象.

OWIN解耦了从服务端来的web 应用程序,这使得OWIN对于子托管web应用程序于自己的进程中得以表现得很完美.

不托管于IIS的原因有:

  • IIS的环境不能构建,比如一个已经存在的服务端程序(没有运行于IIS)
  • IIS的性能开销需要注意的地方
  • signalr功能需要添加到一个现有的应用程序,比如运行在 Windows Service, Azure worker role, 或者 其他进程

如果我们处于性能原因考虑使用self-host,我们推荐将程序同时在IIS中运行测试,来看看性能的具体好处.

本教程包含以下部分:

  • 创建服务端
  • 用 JavaScript 客户端访问服务端

二、创建服务端

在本教程中,您将创建托管在一个控制台应用程序的服务端,当然服务端能够托管于其他任何形式的进程,如Windows service or Azure worker role.

如果你要看如何托管于Windows Service, 可以去看看这里Self-Hosting SignalR in a Windows Service.

  1.用VS创建一个名为 "SignalRSelfHost" 的控制台项目;

  2.在程序包管理器控制台,输入如下命令

  1.   Install-Package Microsoft.AspNet.SignalR.SelfHost

  3.输入如下命令:

  1.   Install-Package Microsoft.Owin.Cors

  该库将提供跨域支持,这对于那些SignalR的服务端和客户端不在同一个域下的程序而言是必须的.

  4.控制台代码

  1. using System;
  2. using Microsoft.AspNet.SignalR;
  3. using Microsoft.Owin.Hosting;
  4. using Owin;
  5. using Microsoft.Owin.Cors;
  6.  
  7. namespace SignalRSelfHost
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. // This will *ONLY* bind to localhost, if you want to bind to all addresses
  14. // use http://*:8080 to bind to all addresses.
  15. // See http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
  16. // for more information.
  17. string url = "http://localhost:8080";
  18. using (WebApp.Start(url))
  19. {
  20. Console.WriteLine("Server running on {0}", url);
  21. Console.ReadLine();
  22. }
  23. }
  24. }
  25. class Startup
  26. {
  27. public void Configuration(IAppBuilder app)
  28. {
  29. app.UseCors(CorsOptions.AllowAll);
  30. app.MapSignalR();
  31. }
  32. }
  33. public class MyHub : Hub
  34. {
  35. public void Send(string name, string message)
  36. {
  37. Clients.All.addMessage(name, message);
  38. }
  39. }
  40. }

上面的代码包括三个类:

  • Program,包含程序的主方法.在这个方法中,类型为Startup的web应用程序启动于指定的URL (http://localhost:8080). 如果需要更加安全一点,可以支持SSL. 请去这里看看How to: Configure a Port with an SSL Certificate

  • Startup, 该类含有SignalR服务端的配置(该教程使用的唯一的配置是用来调用UseCors), MapSignalR为所有形式的Hub对象创建了路由规则.
  • MyHub,  SignalR的Hub 类是程序要提供给客户端的. 该类就一个方法, Send, 客户端可以用来发送消息给其他客户端.

  5.编译并运行程序.

  6.如果程序出现这样的异常: System.Reflection.TargetInvocationException was unhandled, 你需要重启 Visual Studio ,需要administrator 权限.

三、用javascript客户端访问服务端

1.创建项目

2.使用空模板

3.初始化客户端需要的东西

  1. Install-Package Microsoft.AspNet.SignalR.JS

4.初始化客户端需要的东西

5.客户端代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>SignalR Simple Chat</title>
  5. <style type="text/css">
  6. .container {
  7. background-color: #99CCFF;
  8. border: thick solid #808080;
  9. padding: 20px;
  10. margin: 20px;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <div class="container">
  16. <input type="text" id="message" />
  17. <input type="button" id="sendmessage" value="Send" />
  18. <input type="hidden" id="displayname" />
  19. <ul id="discussion"></ul>
  20. </div>
  21. <!--Script references. -->
  22. <!--Reference the jQuery library. -->
  23. <script src="Scripts/jquery-1.6.4.min.js"></script>
  24. <!--Reference the SignalR library. -->
  25. <script src="Scripts/jquery.signalR-2.1.0.min.js"></script>
  26. <!--Reference the autogenerated SignalR hub script. -->
  27. <script src="http://localhost:8080/signalr/hubs"></script>
  28. <!--Add script to update the page and send messages.-->
  29. <script type="text/javascript">
  30. $(function () {
  31. //Set the hubs URL for the connection
  32. $.connection.hub.url = "http://localhost:8080/signalr";
  33. // Declare a proxy to reference the hub.
  34. var chat = $.connection.myHub;
  35.  
  36. // Create a function that the hub can call to broadcast messages.
  37. chat.client.addMessage = function (name, message) {
  38. // Html encode display name and message.
  39. var encodedName = $('<div />').text(name).html();
  40. var encodedMsg = $('<div />').text(message).html();
  41. // Add the message to the page.
  42. $('#discussion').append('<li><strong>' + encodedName
  43. + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
  44. };
  45. // Get the user name and store it to prepend to messages.
  46. $('#displayname').val(prompt('Enter your name:', ''));
  47. // Set initial focus to message input box.
  48. $('#message').focus();
  49. // Start the connection.
  50. $.connection.hub.start().done(function () {
  51. $('#sendmessage').click(function () {
  52. // Call the Send method on the hub.
  53. chat.server.send($('#displayname').val(), $('#message').val());
  54. // Clear text box and reset focus for next comment.
  55. $('#message').val('').focus();
  56. });
  57. });
  58. });
  59. </script>
  60. </body>
  61. </html>
  1. 6.将客户端和服务端同时运行,我们就可以运行了.
  2.  
  3. 7.下载代码:
    点击下载

兄台,为了提升我写作的热情,求支持推荐和关注,祝你玉树临风、气度不凡

《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)的更多相关文章

  1. 《ASP.NET SignalR系列》第二课 SignalR的使用说明

    从现在开始相关文章请到: http://lko2o.com/moon 接续上一篇:<ASP.NET SignalR系列>第一课 认识SignalR (还没有看的话,建议您先看看) 一.指定 ...

  2. 《ASP.NET SignalR系列》第一课 认识SignalR

    从现在开始相关文章请到: http://lko2o.com/moon 一.概述 ASP.NET signalr对ASP.NET开发者来说是一个新的程序库,它能让我们更加容易便捷地开发实时通信功能; s ...

  3. 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式

    1.概述 通过前两篇 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 文章对SignalR的介绍, ...

  4. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  5. 史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  6. 史上最全面的SignalR系列教程-6、SignalR 实现聊天室

    1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...

  7. 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式

    1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...

  8. ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云

    向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平 ...

  9. ASP.NET SignalR 系列(四)之指定对象推送

    在上一章讲到了广播推送,即所有订阅的用户都能收到,这种适合于信息广播. 接下来介绍如何给指定的对象推送 在讲这个之前先说明一下连接创建的基础知识 1.每个页面与服务端创建连接并启动时,这时服务端会产生 ...

随机推荐

  1. 网易云信,发送验证码短信C#版代码

    网易云信发送短信代码(C# 版)....需要注意SHA1 String有转换小写!!!! using System; using System.Collections.Generic; using S ...

  2. 国庆送干货——前端建站实用UI工具vajoyJS

    差不多是从七月开始有空就写一写,写到现在也算是可以拿出来展示了,vajoyJS是一款可以提供多项建站常用UI功能的插件库,让你轻松创建简易幻灯片.模态窗口和单屏滚页等效果.vajoyJS依赖于 jQu ...

  3. Java虚拟机1:什么是Java

    前言 让我们来看一下Java的广告词,来自http://www.java.com/zh_CN/about/: 97%的企业桌面运行Java 美国有89%的桌面(或计算机)运行Java 全球有900万J ...

  4. JS闭包中的this对象

    我们知道,当函数被作为某个对象的方法调用时,this等于那个对象,不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window. 下面代码很好的说明了这一点: var name = 'T ...

  5. DBCC DROPCLEANBUFFERS失效了?

    原文出处:http://www.sqlskills.com/blogs/paul/when-dbcc-dropcleanbuffers-doesnt-work/ DBCC DROPCLEANBUFFE ...

  6. JavaScript 正则表达式上——基本语法

    定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

  7. List.Foreach与C#的foreach的区别

    几年前参加面试时就被提问过,现在面试别人时也经常提到这个问题. 今天小试了一下.得出如下几点: 1. 首先,mscorlib里System.Collections.Generic. List<T ...

  8. 10 个 Redis 建议/技巧

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/145.html?1455790611 Redis 在当前的技术社区里是非常 ...

  9. 大叔也说Xamarin~Android篇~日志的记录

    回到目录 无论哪个平台,开始哪种应用程序,日志总是少不了的,大家在Lind.DDD里也可以看到大叔的日志组件,而在xamarin进行移动开发时,为了更好的调试,记录运行的情况,日志也是必须的,这讲主要 ...

  10. ASP.NET Web API 2框架揭秘

    ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...