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函数为每个客户端调用一次,并循环直到客户端选择关闭连接.与此同时,它回应它收到的任何东西 免责声明:我也只是想绕着网络套接字而烦恼,但我想分享我的后代发现,因为没有人回答你的问题.我欢迎任何更正. 编辑 UPDATE 然后我想到了一个可能的解决方案: >使用单独的应用程序,例如处理websocket请求的服务程序(在IIS之外). 这对我来说太麻烦了,这让我暂时不再实施websocket …… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |