【问题标题】:SignalR 2.0.2 Creating PersistentConnectionSignalR 2.0.2 创建持久连接
【发布时间】:2014-02-02 15:50:42
【问题描述】:

我使用包管理器控制台将 SignalR 2.0.2 安装到我的 MVC 4.5 应用程序中。我做了连接配置的标准示例。

namespace SignalRPersistent
{

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR("/echo");
        }
    }
}

问题是MapSignalR方法不接受字符串,编译时报错说

参数类型字符串不可分配给参数类型 SignalRHubConfiguration。但我可以看到一个接受字符串但坚持不编译的重载方法。有什么问题?

【问题讨论】:

    标签: c# asp.net-mvc-4 signalr


    【解决方案1】:

    我更改了如下代码,然后开始工作。

    app.MapSignalR<ConnectionHub>("/echo");
    

    ConnectionHub 是继承自 PersistentConnection 的类。互联网上的示例不需要指定类,但它们对我不起作用。

    【讨论】:

    【解决方案2】:

    好的,Ryu 提供的解决方案是正确的 - 但可能会让许多人感到困惑。老实说,我还没有找到一个演练(使用与示例完全相同的代码)——但没有任何效果,部分原因是随着信号器项目的推进,很多东西都变得过时了。

    所以,你有一个扩展 PersistentConnection 的类,在这个类中你有所有的任务(OnConnected、OnReceived 等):

    using System.Threading.Tasks;
    using Microsoft.AspNet.SignalR;
    
    public class MyAwesomeConnection : PersistentConnection
    {
        protected override Task OnConnected(IRequest request, string connectionId)
        {
            var fromClient = request.QueryString["testQuery"];
    
            return base.OnConnected(request, connectionId);
        }
    
    
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            return base.OnReceived(request, connectionId, data);
        }
    }
    

    然后您在 OwinStartup 类中“映射”该类(在本例中为 MyAwesomeConnection):

    using DataCommunication;
    using Microsoft.Owin;
    using Owin;
    
    [assembly: OwinStartup(typeof(SignalRServer.Startup))]
    namespace SignalRServer
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.MapSignalR<MyAwesomeConnection>("/server");
            }
        }
    }
    

    现在您可以使用 javascript 进行连接,并且在引用 jquery 和 jquery.signalR 脚本时要非常小心。首先是 jquery,其次是 jquery.signalR,然后是所有其他使用 signalR 的脚本并避免使用 @Scripts.Render("bundles/jquery")。用老式的方式来做吧:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width" />
        <title>@ViewBag.Title</title>    
        <script type="text/javascript" src="Scripts/jquery-1.10.2.min.js"></script>
        <script type="text/javascript" src="Scripts/jquery.signalR-2.1.1.min.js"></script>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
    
    <script>
        var connection = $.connection("/server", "testQuery=This crap finally works", true);
        connection.start();
    </script>
    
    @RenderBody()    
    
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    
    </body>
    </html>
    

    在 MyAwesomeConnection 类的 OnConnected 中的某处设置断点,并读出变量 fromClient,一旦客户端 (javascript) 连接就会触发该变量。它应该有希望读出“这个废话终于起作用了”。

    现在您应该很高兴使用 signalR 构建一些壮观的东西,如果仍然无法正常工作 - 那么您要么缺少 nuget 中的一些程序集,要么在项目中未正确设置引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多