【问题标题】:Understanding the loading process of SignalR了解 SignalR 的加载过程
【发布时间】:2014-05-21 03:15:26
【问题描述】:

我正在尝试学习和设置一个具有一定规模(约 1500 个并发用户)的 SignalR 解决方案,并且我想确保我完全了解它在幕后的工作原理。

特别是,如果有人可以向我解释以下设置如何实际启动 SignalR,我将不胜感激

(取自)

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

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();
        }
    }
}

我可以看到代码为 Owin 使用了 assembly 注释,它还指定了要启动的类。

但我正在努力解决这实际上是如何工作的。

OWIN dll 何时实际加载,Startup 类何时实际加载?

为什么 SignalR 需要 OWIN?它只是一个方便的使用库吗?

【问题讨论】:

    标签: c# asp.net signalr owin


    【解决方案1】:

    asp.net 上有一个很好的参考。

    每个 OWIN 应用程序都有一个启动类,您可以在其中指定应用程序管道的组件。根据您选择的托管模型(OwinHost、IIS 和 IIS-Express),您可以通过多种方式将启动类与运行时连接。

    基本上,SignalR 是一个 OWIN(.NET 的开放式 Web 界面)中间件。

    来自getting started with OWIN and Katana

    Open Web Interface for .NET (OWIN) 定义了 .NET Web 服务器和 Web 应用程序之间的抽象。通过将 Web 服务器与应用程序分离,OWIN 可以更轻松地为 .NET Web 开发创建中间件。此外,OWIN 可以更轻松地将 Web 应用程序移植到其他主机,例如,在 Windows 服务或其他进程中自托管。

    在应用启动期间,Katana 搜索启动类以将每个中间件组件引导到应用中。您可以考虑以与从 global.asaxapp.runvoid main 或其他方式初始化传统引导对象相同的方式处理您创建的任何启动类,而不受这些方法的上下文的约束。

    编辑

    javascript 文件/signalR/hubs 的问题相当复杂,但有相当数量的documentation。本质上,引用是对动态生成的代理。

    当您编写代码来调用服务器方法时,生成的代理使您能够使用看起来好像在执行本地函数的语法:您可以编写 serverMethod(arg1, arg2) 而不是 invoke('serverMethod', arg1,参数 2)。如果您输入错误的服务器方法名称,生成的代理语法还会导致立即且可理解的客户端错误。如果您手动创建定义代理的文件,您还可以获得 IntelliSense 支持以编写调用服务器方法的代码。

    问题在于 Sitecore 和其他 CMS 实用程序实际上会尝试处理其路由中的 URL 模式,而不是允许代理采取行动。您需要确保您的 CMS 为 SignalR 位指定了忽略。

    在 web.config 中,更新您的 IgnoreUrlPrefixes:

    <setting name="IgnoreUrlPrefixes"
        value="/sitecore/default.aspx|/trace.axd|
         .....
        |/signalr|/signalr/hubs" />
    

    【讨论】:

    • 好吧,如果我错了,请纠正我,但是 OWIN 标准抽象出我确实在使用 IIS,但我可以使用其他任何东西并且代码不会改变?
    • 我认为另一个让我感到困惑的地方是app.MapSignalR() 方法是一个扩展方法,而不是在IAppBuilder 接口上,所以看起来 SignalR 被融入了 OWIN
    • 是的,您可以使用支持 Katana 进程的其他主机,而不会更改中间件的实现。另外,是的,IAppBuilder 界面起初令人困惑。
    • 作为一个附加问题,对/signalR/hubs 文件的请求,究竟是什么服务?是由负责处理它的app.MapSignalR() 处理的吗?我问的原因是我试图将 SignalR 安装到 CMS (sitecore) 中,这似乎完全忽略了调用并返回 404
    • /signalR/hubs 本身就是一个相当大的概念,所以我将用更多信息编辑答案,但它可能值得自己提出问题。
    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2021-09-07
    • 2015-03-23
    • 2013-05-14
    相关资源
    最近更新 更多