gpt4 book ai didi

c# - Owin Websockets - 了解 IOwinContext 和 WebSocketAccept

转载 作者:太空狗 更新时间:2023-10-29 20:30:24 24 4
gpt4 key购买 nike

通读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是从哪里来的呢?如果我们想在确定它是一个网络套接字请求后将其进一步传递到管道中怎么办?

最佳答案

什么是 WebSocketAccept?

WebSocketAcceptusing alias

例子:

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

这里我们使用来自 2 个不同命名空间的 Bar,但我们将第二个命名为“MyBar” ' 这样我们就可以区分两者。

为什么使用别名作为 WebSocketAccept?

本例中的别名只是为了方便,这样您就不必键入整个名称,这意味着您可以使用别名代替而不是在使用时写下整个名称。

了解 WebSocketAccept

如果我们仔细观察,我们会发现类型是:

Action<A, B>

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

(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),正如我们上面讨论的 (Action<A, B>)。

第一个参数是一个普通的字典,里面包含了websocket接受的参数。

第二个参数是一个接受字典并返回任务的函数。

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

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

一旦我们确定它是一个网络套接字请求,如果我们想将它进一步传递到管道中怎么办?

在例子中,回调函数是WebSocketEcho但本质上你可以传入任何满足函数签名的函数:

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

要点是您不调用该函数,该函数会为您调用。您指定在协商网络套接字请求连接后,您决定会发生什么。

WebSocketEcho函数为每个客户端调用一次,并循环直到客户端选择关闭连接。同时它会回显它收到的任何内容。

免责声明:我也只是想全神贯注于网络套接字和 owin,但我想为后代分享我的发现,因为没有人回答你的问题。我欢迎任何更正。

编辑
我在自己的实验中注意到,如果您从回调函数返回 websocketContext连接将是 Abort编辑。这意味着如果您通过 websocketContext,您将无法在连接上发送/接收消息结束回调后左右。

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

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

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

这对我来说太麻烦了,这让我暂时搁置了实现 websocket...

关于c# - Owin Websockets - 了解 IOwinContext 和 WebSocketAccept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com