阅读here并查看here示例:我试图理解WebSocketAccept的实际作用。我知道WebSocketAccept是:using WebSocketAccept = Action < IDictionary<string, object>, // WebSocket Accept parameters Func // WebSocketFunc callback < IDictionary<string, object>, // 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()到底在做什么呢?它是在调用WebSocketAccept的Func 属性并定义了WebSocketEcho方法吗? WebSocketEcho定义为: private async Task WebSocketEcho(IDictionary<string, object> websocketContext)那么websocketContext是从哪里来的呢?如果我们希望在确定它是Web套接字请求之后将其进一步传递给管道,该怎么办? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 什么是WebSocketAccept?WebSocketAccept是using alias例子:...using Foo.Barusing MyBar = Fee.Bar...在这里,我们使用来自2个不同 namespace 的Bar,但是我们为第二个命名空间添加了'MyBar'别名,以便我们可以区分这两个 namespace 。为什么要使用别名作为WebSocketAccept?在这种情况下,别名只是一种方便,因此您不必键入整个内容,这意味着您可以使用别名代替使用时输入的完整名称。了解WebSocketAccept如果我们仔细观察,我们会看到类型为:Action<A, B>这意味着在C#lambda中,它实际上是一个不返回并接受2个参数的函数:(A, B) => { }我们看到第一个参数(A)是:IDictionary<string, object>,也称为Owin环境。第二个参数(B)是:Func<C, D>,这意味着它是一个接受C并返回D的函数。在C#lambda中:(C) => { return D; }然后,我们需要深入研究第二个参数(B)的第一个参数(C)。而且我们看到它需要一个Owin环境并返回Task。什么是接受?accept尝试从IOwinContext中提取参数并将其映射到WebSocketAccept类型。如果无法提取它们,则为null,然后我们继续下一个中间件。否则,这是一个websocket请求,我们调用带有2个参数的函数(WebSocketAccept),如上所述。第一个参数是普通字典,其中包含websocket接受参数。第二个参数是接受字典并返回任务的函数。该代码所执行的操作是由其他人调用的,是将回调函数传递给调用者。然后,调用者使用正确的参数调用该函数。因为调用者知道函数的签名。接受websocket连接请求后,该函数称为。因此,评论回调。如果我们希望在确定它是Web套接字请求之后将其进一步传递给管道,该怎么办?在示例中,回调函数是Action<A, B>,但是从本质上讲,您可以传入任何满足以下条件的函数签名的函数:Task MyCallbackFunction(IDictionary<string, object> context){ // Do something return Task.FromResult(0);}得出的结论是,您不调用该函数,而是为您调用了该函数。您可以指定在协商Web套接字请求连接之后,确定发生什么情况。WebSocketEcho函数为每个客户端调用一次,并循环直到客户端选择关闭连接。同时,它回显所收到的任何信息。免责声明:我也只是想将我的头缠在网络套接字和owin上,但是我想分享我的发现以供后代使用,因为没有人回答您的问题。我欢迎任何更正。 编辑我通过自己的实验注意到,如果您从回调函数返回,则WebSocketEcho连接将被websocketContext ed编辑。这意味着,如果在结束回调之后传递Abort,则无法在连接上发送/接收消息。 更新上一次我尝试在Windows 2008 R2 IIS 7.5服务器上使用它时,无法使websocket正常工作。然后根据此:https://stackoverflow.com/a/14130152/1640121-IIS 7.5服务器不支持websocket。这意味着,如果您的应用程序托管在IIS 7.5中,它将无法使用websocket。然后我想到了一个可能的解决方案:使用单独的应用程序,例如处理Websocket请求的服务程序(IIS外部)。 使用反向代理将请求映射到服务应用程序这对我来说太麻烦了,这使我暂时搁置了一个websocket ... (adsbygoogle = window.adsbygoogle || []).push({});
10-07 14:53