c# – Owin Websockets – 了解IOwinContext和WebSocketAccept

阅读 here并查看示例 here

我试图了解WebSocketAccept实际上做了什么.我知道WebSocketAccept是:

using WebSocketAccept =
    Action
    <
        IDictionary<string,object>,// WebSocket Accept parameters
        Func // WebSocketFunc callback
        <
            IDictionary<string,// WebSocket environment
            Task // Complete
        >
    >;

并以这种方式使用:

public void Configuration(IAppBuilder app)
    {
        app.Use(UpgradetoWebSockets);
        app.UseWelcomePage();
    }

    // Run once per request
    private Task UpgradetoWebSockets(IOwinContext context,Func<Task> next)
    {
        WebSocketAccept accept = context.Get<WebSocketAccept>("websocket.Accept");
        if (accept == null)
        {
            // Not a websocket request
            return next();
        }

        accept(null,WebSocketEcho);

        return Task.Fromresult<object>(null);
    }

那么accept()实际上是做什么的?它是否正在调用Func<> WebSocketAccept的属性和定义WebSocketEcho的方法? WebSocketEcho定义为:

private async Task WebSocketEcho(IDictionary<string,object> websocketContext)

那websocketContext来自哪里?如果我们确定它是一个Web套接字请求,我们想要在管道中进一步传递这个怎么办?

解决方法

什么是WebSocketAccept?

WebSocketAccept是一个using alias

例:

...
using Foo.Bar
using MyBar = Fee.Bar
...

这里我们使用来自2个不同命名空间的Bar,但我们将第2个命名为’MyBar’,以便我们可以区分这两个.

为什么使用别名作为WebSocketAccept?

在这种情况下的别名只是一个方便,因此您不必键入整个内容,这意味着您可以使用别名而不是在使用它时编写整个名称.

了解WebSocketAccept

如果我们仔细观察,我们会看到类型是:

Action<A,B>

这意味着它本质上是一个函数,它不返回并在C#lambda中接受2个参数:

(A,B) => { }

我们看到第一个参数(A)是:IDictionary< string,也称为Owin环境.

第二个参数是(B)是:Func< C,D>这意味着它是一个函数,它接受一个C并返回一个D.在C#lambda中:

(C) => { return D; }

然后我们需要深入研究第二个参数(B)的第一个参数(C).我们看到它需要一个Owin环境并返回一个Task.

什么是接受?

accept尝试从IOwinContext中提取参数并将它们映射到WebSocketAccept类型.

如果它无法提取它们,则它为null,我们继续下一个中间件.

否则它是一个websocket请求,我们调用带有2个参数的函数(WebSocketAccept),如上所述(Action< A,B>).

一个参数是普通字典,它包含websocket接受参数.

第二个参数是一个获取字典并返回任务的函数.

函数由其他人调用,代码所做的是将回调函数传递给调用者.

然后调用者使用正确的参数调用函数.因为调用者知道函数的签名.该函数在接受websocket连接请求后被调用.因此评论回调.

如果我们确定它是一个Web套接字请求,我们想要在管道中进一步传递这个怎么办?

在示例中,回调函数是WebSocketEcho,但基本上您可以传入满足以下函数签名的任何函数

Task MyCallbackFunction(IDictionary<string,object> context)
{
    // Do something
    return Task.Fromresult(0);
}

外卖是你不调用函数,函数是为你调用的.您指定在协商Web套接字请求连接后,您决定发生了什么.

WebSocketEcho函数为每个客户端调用一次,并循环直到客户端选择关闭连接.与此同时,它回应它收到的任何东西

免责声明:我也只是想绕着网络套接字而烦恼,但我想分享我的后代发现,因为没有人回答你的问题.我欢迎任何更正.

编辑
我注意到我自己的实验,如果从回调函数返回,websocketContext连接将被中止.这意味着如果在结束回调后传递websocketContext,则无法在连接上发送/接收消息.

UPDATE
上次我尝试在Windows 2008 R2 IIS 7.5服务器上使用它时,我无法使websocket工作.然后根据这个:https://stackoverflow.com/a/14130152/1640121 – IIS 7.5服务器不支持websockets.
这意味着如果您的应用程序托管在IIS 7.5中,它将无法拥有websockets.

然后我想到了一个可能的解决方案:

>使用单独的应用程序,例如处理websocket请求的服务程序(在IIS之外).
>使用反向代理将请求映射到服务应用程序

这对我来说太麻烦了,这让我暂时不再实施websocket ……

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...