ASP.Net MVC SignalR的应用

ASP.Net MVC SignalR的应用

最近做的一个MVC项目有个模块是要使用即时通信实现弹幕效果。既要考虑通信的实时性也要考虑服务器性能和资源消耗,所幸项目对浏览器的版本没有要求。所以我最先想到用WebSocket来实现,在查询资料时, 看到 SignalR 这个技术,也就是本专题所讨论的对象。在拜读了 史上最全面的SignalR系列教程-认识SignalR ,算是对 SignalR有一个简单的认识,SignalR 是 .NET平台为我们提供的一种简洁高效智能的实时信息交互技术,SignalR 比 WebSocket 还要简单,这简直是我的福音。所以我直接一个Demo开始尝试。

SignalR

关于SignalR的介绍这边就不多赘述,可以去看我上面说的这篇博文史上最全面的SignalR系列教程-认识SignalR 或者直接看Microsoft文档 Introduction to SignalR,SignalR可用于任何即时性的功能;

Demo :使用SignalR和MVC 5实现实时聊天

通过第一部分的介绍,相信大家对SignalR有初步的认识,接下来直接上手一个Demo来看看(我的开发环境:VS2019 + .net 4.6.2 + MVC 5)。步骤参考微软教程 Tutorial: Real-time chat with SignalR 2 and MVC 5

  1. 使用Visual Studio 2019 创建一个MVC工程-SignalRMvcChat

创建ASP.NET Web应用程序

配置项目

  1. 选择MVC,然后身份验证上,选择“无身份验证”,然后单击“创建”。

  1. 在项目上右击-添加新建项,选择 Installed > Visual C# > Web > SignalR and then 选择 SignalR Hub Class (v2).

  1. 将类命名为ChatHub并将其添加到项目中。 此步骤将创建ChatHub.cs集线器类文件,并将一组支持SignalR的脚本文件和程序集引用添加到项目:

  1. 用以下代码替换新建的ChatHub.cs类文件中的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace SignalRMvcChat
{
    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            Clients.All.addNewMessageToPage(name, message);
        }
    }
}
  1. 在项目上,右键选择 添加>,命名为Startup.cs,并用以下代码替换新建的Startup.cs类文件中的代码:
using Owin;
using Microsoft.Owin;
[assembly: OwinStartup(typeof(SignalRMvcChat.Startup))]
namespace SignalRMvcChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

注意: SignalR 框架使用Owin组件,每一个使用的OWin组件的Web框架都需要一个Startup入口类,用来声明OWin组件:

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

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

3.如果你的启动类不在当前命名空间下,需要在Web.config中添加节点: ,来指定启动类;

  1. 在Home控制器中添加一个方法,来返回下面聊天步骤所使用的页面:在 HomeController.cs 中添加以下方法:
public ActionResult Chat()
{
    return View();
}
  1. 在Views/Home中添加Chat视图,并用以下代码替换到新建的视图文件中:(注意:视图中所引用的signalR脚本可能跟你实际安装的版本不一样,这里需要你根据实际安装的版本进行修改)
@{
    ViewBag.Title = "Chat";
}
<h2>Chat</h2>
<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion"></ul>
</div>
@section scripts {
    <!--jQuery库是必需的,默认情况下在_Layout.cshtml引用. -->
    <!--引用SignalR库. -->
    <script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
    <!--引用自动生成的SignalR 集线器(Hub)脚本.在运行的时候在浏览器的Source下可看到. -->
    <script src="~/signalr/hubs"></script>
    <script>
        $(function () {
            // 引用自动生成的集线器代理 必须用小写字母开头.
            var chat = $.connection.chatHub;

            // 定义服务器端调用的客户端addNewMessageToPage来处理接收到的消息.
            chat.client.addNewMessageToPage = function (name, message) {
                // 将消息添加到ul上.
                $(‘#discussion‘).append(‘<li><strong>‘ + htmlEncode(name)
                    + ‘</strong>: ‘ + htmlEncode(message) + ‘</li>‘);
            };

            // 获取用户名.
            $(‘#displayname‘).val(prompt(‘Enter your name:‘, ‘‘));

            // 设置焦点到输入框.
            $(‘#message‘).focus();

            // 开始连接服务器 done函数表明建立连接成功后为发送按钮注册了一个click事件.
            $.connection.hub.start().done(function () {
                $(‘#sendmessage‘).click(function () {
                    // 调用服务器端集线器的Send方法 也要小写开头.
                    chat.server.send($(‘#displayname‘).val(), $(‘#message‘).val());
                    // 清空输入框信息并获取焦点.
                    $(‘#message‘).val(‘‘).focus();
                });
            });
        });

        // 这个可选功能将html-encodes消息显示在页面上.
        function htmlEncode(value) {
            var encodedValue = $(‘<div />‘).text(value).html();
            return encodedValue;
        }
    </script>
}

运行一下看看效果:

  • 在工具栏中,启用“脚本调试”,然后点击“运行”按钮以在浏览器上调试(注意启动项目要设成当前的这个MVC项目)。

-进入聊天页面 ~/Home/Chat

1

可能出现的问题:

The following errors occurred while attempting to load the app.

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的appSetting中添加如下的节点:

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

运行居然真的就不报错,但是问题更大条了。在聊天页面并没有生成SignalR代理的hubs的脚本文件,出现了Uncaught TypeError: Cannot read property ‘client‘ of undefined错误

对比了微软官方使用 SignalR 步骤,才认识到 SignalR 框架使用Owin组件,一定要指定一个Startup入口类,我是少了以上步骤6,在添加了Startup.cs类之后,问题解决了(添加的Startup.cs类的命名空间为应用程序根目录的名称,去掉之前web.config中加入的错误代码)。对于SignalR代理对象异常,大家还可以看下这篇文章, SignalR代理对象异常:Uncaught TypeError: Cannot read property ‘client‘ of undefined 推出的结论,只要注意自动生成的集线器脚本中的代理名称和服务端方法都是小写字母开头,调用的时候使用小写就可以避免这个问题。

查看源码

以上就是今天给大家的分享全部内容了,祝大家元旦快乐!

参考文章

原文地址:https://www.cnblogs.com/anayigeren/p/12129597.html

时间: 2024-10-25 15:18:50

ASP.Net MVC SignalR的应用的相关文章

ASP.NET MVC SignalR(1):背景

系列目录:ASP.NET MVC SignalR 关键词:HTTP.轮询.WebSocket.Server-Sent Events.长轮询.forever frame. 1. HTTP HTTP(HyperText Transfer Protocol,超文本传输协议)是Web应用程序客户端和服务器之间进行“交谈”的语言. HTTP操作基于请求-响应模式,这种模式通常从客户端发起请求开始.同时,请求-响应模式通常也被称作拉(pull)模式:当客户端需要访问服务器上的资源时,它有目的地发起一个到服务

asp.net mvc signalr 简单聊天室

signalr的神奇.实用很早就知道,但一直都没有亲自去试用,仅停留在文章,看了几篇简单的介绍文字,感觉还是很简单易用的. 由于最后有个项目需要使用到它,所以就决定写个小程序测试一下,实践出真知:别人写的文章,由于环境(版本等)不同,还是或多或少存在一些出入的. 环境:vs2013 / asp.net mvc 5 / signalr 2.2.1 / jquery 1.10.2 先上两个效果图: 系统会自动给加入聊天室的人员分配一个ID,是该人员的唯一标识(绿色为当前用户说的话,橙色为当前用户之外

AngularJS+ASP.NET MVC+SignalR实现消息推送

原文:http://www.mincoder.com/article/4565.shtml 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现的是firebase,于是很兴奋的开始倒腾起来.firebase用 起来倒是简单:引用一个js即可,按官网上的教程很快便应用到了项目中.第二天打开项目发现推送功能不好使了,这是为何?最后发现firebase官网打 不开了...难道firebase被google收了也会被天朝给墙掉?也许

ASP.NET MVC SignalR

本系列博文主要介绍了 ASP.NET SignalR 的相关知识与开发,参考来源为<ASP.NET SignalR 编程实践>. 目录: SignalR背景 SignalR概述

asp.net MVC SignalR 与数据库 实时同步显示

错误:未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 Service Broker 解决方法为: c# 未启用当前数据库的 SQL Server Service Broker 因此查询通知不受支持如果希望使用通知,请为此数据库启用 Service Broker ALTER DATABASE BlogDemos SET NEW_BROKER WITH ROLLBACK IMMEDIATE;ALTER DATABASE

ASP.NET MVC和EF集成AngularJS开发

参考资料: 如何在ASP.NET MVC和EF中使用AngularJS AngularJS+ASP.NET MVC+SignalR实现消息推送 [AngularJs + ASP.NET MVC]使用AntularJs快速建立ASP.NET MVC SPA網站

在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常:

自从在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常: Server Error in '/' Application. The following errors occurred while attempting to load the app.- No assembly found containing an OwinStartupAttribute.- No assembly found containing a Startup or [

Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现保存消息,历史消息和用户在线 由于,我这是在一个项目([无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引)的基础上做的,所以使用到的一些借口和数据表,不详细解析,只是介绍一下思路和实现方式,供大家参考 用户登录注册信息 当用户登录之后,我们注册一下用户的信息,我们

Asp.NET MVC 中使用 SignalR 实现推送功能

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(lo