ASP.NET SignalR是一个ASP.NET 下的类库,可以在ASP.NET 的Web项目中实现实时通信。实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单

下面通过一个简单例子介绍SignalR的用法:

项目结构如下:

为了支持 SignalR,使用 NuGet 控制台往项目中安装了 SignalR,这里我用的是2.1.2版本

安装命令:

Install-Package Microsoft.AspNet.SignalR -Version 2.1.

更新命令:

UPDATE-Package Microsoft.AspNet.SignalR -Version 2.4.
UPDATE-Package jQuery -Version 1.8.

首先我们新建一个SignalR集线器代理类MyChatHub,该类需要继承 Hub 类,并创建一个业务逻辑需要的方法,本例中主要应用到的方法:

//调用所有客户端的SendMessage方法
Clients.All.SendMessage(message);

MyChatHub完整类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//先在Nuget上搜索Microsoft.AspNet.SignalR安装
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs; namespace SignalRDEMO
{
/// <summary>
/// 自定义SignalR集线器代理类名称
/// </summary>
[HubName("myChatHub")]
public class MyChatHub : Hub
{
/// <summary>
/// 推送至所有客户端
/// </summary>
/// <param name="message">消息</param>
public void Send(string message)
{
//调用所有客户端的SendMessage方法
Clients.All.SendMessage(message);
}
}
}

接着新建一个web页面WebForm1.aspx,在页面中实例化 SignalR 类,做具体业务逻辑代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SignalRDEMO.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>SignalR实时消息推送到客户端</title>
<script src="Scripts/jquery-1.8.2.js"></script>
<!--引用SignalR库-->
<script src="Scripts/jquery.signalR-2.1.2.min.js"></script>
<!--引用自动生成的SignalR集线器(Hub)脚本.在运行的时候在浏览器的Source下可看到-->
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
//引用服务端的集线器代理类
var chat = $.connection.myChatHub;
//定义服务器端调用的客户端SendMessage方法来显示新消息
chat.client.SendMessage = function (message) {
ShowMessage(message);
};
//$.extend(chat.client, {
// SendMessage: function (message) {
// ShowMessage(message);
// }
//}); //设置焦点到输入框
$('#message').focus(); //开始连接服务器
$.connection.hub.start().done(function () {
$('#SendMessage').click(function () {
//调用服务器端定义的Send方法
chat.server.send($('#message').val());
//清空输入框信息并获取焦点
$('#message').val('').focus();
});
});
});
//向页面添加消息
function ShowMessage(message) {
$('#list').append('<li>' + message + '</li>');
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="text" id="message" />
<input type="button" id="SendMessage" value="发送" />
<ul id="list">
</ul>
</div>
</form>
</body>
</html>

OK了,可以运行网站试试,看是否报错,很遗憾还是报错了,错误信息如下:

The following errors occurred while attempting to load the app.
- No assembly found containing an OwinStartupAttribute.
- No assembly found containing a Startup or [AssemblyName].Startup class.
To disable OWIN startup discovery, add the appSetting owin:AutomaticAppStartup with a value of "false" in your web.config.
To specify the OWIN startup Assembly, Class, or Method, add the appSetting owin:AppStartup with the fully qualified startup class or configuration method name in your web.config.

运行之后,应该不少朋友有这样的报错(可能是中文的错误提示)!

看着错误提示,其实直接就知道大概什么情况了,OwinStartupAttribute 没有找到!

紧跟着提示了两种做法,也就是这两种做法误导了初学者!

我们按照提示,于是在网上搜索得到的做法是在Web.config中添加:

<appSettings>
<add key="owin:AutomaticAppStartup" value="false" />
</appSettings>

之后再次运行网站看看是否报错,我去还是报错啊,说明上面做法不启用,只能去调试看看,调试发现,浏览到业务所在页面,报错:

GET http://localhost:10292/signalr/hubs 404 (Not Found)
Uncaught TypeError: Cannot read property 'client' of undefined

到网上搜了很多,最后搜到官方使用 SignalR 步骤:

http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

其中第6和7步骤解决了问题就是需要新建一个类Startup

然后给出了代码(注意红色):

using Microsoft.Owin;
using Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
app.MapSignalR();
}
}
}

果然,当添加完这样的类之后,问题解决了,业务功能实现了( 去掉之前web.config中加入的错误代码)!

所以要切记使用SignalR需要同时增加一个Starup.cs, 用于Owin

运行效果图如下:

每一个使用的OWin组件的Web框架都需要一个StartUp入口类,用来声明OWin组件:

1. 项目会自动扫描程序集根下的名为StartUp的类作为入口类

2. 通过添加 [assembly: OwinStartup(typeof(SignalRDEMO.Startup))] 标签标记入口类

3. 如果你的启动类不在当前命名空间下 <add key="owin:AppStartup" value="[NameSpace].Startup" />

4. 由于第一点的存在,所以如果有名为StartUp的类,并且不是入口点,需要使用 <add key="owin:AutomaticAppStartup" value="false" />

Asp.net SignalR 实现服务端消息实时推送到所有Web端的更多相关文章

  1. 基于HTTP协议之WEB消息实时推送技术原理及实现

    很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页 ...

  2. WebSocket实现站内消息实时推送

    关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...

  3. dwr3+spring实现消息实时推送

    最近项目要实现一个消息推送的功能,主要就是发送站内信或者系统主动推送消息给当前在线的用户.每次的消息内容保存数据库,方便用户下次登录后也能看到.如果当前用户在线,收到站内信就主动弹出提示.一开始想到的 ...

  4. C#服务端通过Socket推送数据到Android端App中

    需求: 描述:实时在客户端上获取到哪些款需要补货. 要求: 后台需要使用c#,并且哪些需要补货的逻辑写在公司框架内,客户端采用PDA(即Android客户端 版本4.4) . 用户打开了补货通知页面时 ...

  5. 基于swoole+Redis的消息实时推送通知

    swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos ...

  6. 利用socket.io实现消息实时推送

    最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...

  7. php 消息实时推送(反ajax推送)

    入口文件index.html <!DOCTYPE HTML> <html> <head> <title>反ajax推送</title> &l ...

  8. nodejs+socketio+redis实现前端消息实时推送

    1. 后端部分 发送redis消息 可以参考此篇实现(直接使用Jedis即可) http://www.cnblogs.com/binyue/p/4763352.html 2.后端部分: 接收redis ...

  9. Channels集成到Django消息实时推送

    channel架构图 InterFace Server:负责对协议进行解析,将不同的协议分发到不同的Channel Channel Layer:频道层,可以是一个FIFO队列,通常使用Redis Dj ...

随机推荐

  1. mongodb 开发规范

    一.命名规则 1.数据库命名规则 数据库名可以是满足以下条件的任意UTF-8字符串: (1)不能是空字符串(”") : (2)不能含有”(空格)...$./..和(空字符): (3)应全部小 ...

  2. html5文件夹上传源码

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  3. b/s利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  4. P2313 [HNOI2005]汤姆的游戏

    题目描述 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣.于是他开始在一张很大很大的白纸上画很多很多的矩形和圆.画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花.汤姆发现爆米 ...

  5. Mac 解决终端:-bash: /Users/xxx/.profile: No such file or directory

    touch ~/.profile加入export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 参考:https://www.zhihu.com/ ...

  6. 更新Xcode 8后运行时,在打印台会输出一堆东西(Xcode 8日志输出问题)

    使用 Xcode 8 运行工程的时候,在打印台会发现如下这些奇怪的日志输出: 2016-09-19 10:43:44.001757 Demo[7100:171568] subsystem: com.a ...

  7. OpenVirtex安装

    目录 环境 安装 环境 我使用的java以及maven版本如下: jdk7下载地址:https://www.oracle.com/technetwork/java/javase/downloads/j ...

  8. ArcGIS10.3_解决属性表中文乱码问题

    借鉴前辈们解决ArcMap低版本属性表乱码的问题解决方法,勇敢的尝试了一下Pro中的解决方法,其实道理都一样.先来看看第一种方法:打开CMD,如果是ArcMap,输入如下命令: reg add HKE ...

  9. css 文本省略号设置

    本文推荐2种方法. 1. css tip:只兼容chrome内核的浏览器.ff不支持. .box { overflow: hidden; /* 溢出时不显示溢出的内容 */ text-overflow ...

  10. vue官网笔记

    学习了vue后又重新过了一遍官网的教程,选择性地摘抄了一些自己觉得比较重要的知识点.以备后面查缺补漏用. 计算属性 计算属性mounted中,属性值函数将用作属性的getter函数.当函数中的依赖发生 ...