- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图了解 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
是 using alias
例子:
...
using Foo.Bar
using MyBar = Fee.Bar
...
这里我们使用来自 2 个不同命名空间的 Bar,但我们将第二个命名为“MyBar
” ' 这样我们就可以区分两者。
本例中的别名只是为了方便,这样您就不必键入整个名称,这意味着您可以使用别名代替而不是在使用时写下整个名称。
如果我们仔细观察,我们会发现类型是:
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。
然后我想到了一个可能的解决方案:
这对我来说太麻烦了,这让我暂时搁置了实现 websocket...
关于c# - Owin Websockets - 了解 IOwinContext 和 WebSocketAccept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836647/
我已经通过创建一个新应用程序并将代码复制到 mvc5 中将我的 mvc4 应用程序移动到 mvc5 - 以避免在更新 DLL 时发生任何冲突 当我调试我的新解决方案时,无法加载任何页面,因为内置的 I
如何从 IOwinContext 获取浏览器? 我正在尝试记录来 self 的owin中间件的请求及其响应(下面的代码)。 public async override Task Invoke(IOwi
我希望从请求中获取路由模板。我正在使用 OwinMiddleware 并重写接受 IOwinContext 的 Invoke 方法。 public override async Task Invoke
我决定将帐户确认和密码恢复与 ASP.NET 身份结合使用。我正在使用 Identity 2.1.0。我将来自 NuGet 的示例 MVC 应用程序安装到一个空项目中,以便查看它的配置方式。 将更改合
我开始为我的 API 使用 Owin 自托管,现在我正在尝试修复一些测试,这些测试开始失败,因为 Owin 不支持 HttpContext.Current 现在我无法从 IOwinContext 获取
如何从 SignalR hub 访问 IOwinContext(例如从 HubCallerContext)? 最佳答案 如果您使用的是 IIS,则可以通过 HubCallerContext(Hub 基
将 IOwinContext 注入(inject)我的 OAuthAuthorizationServerProvider 时出现问题。 在我的 Startup.cs 中有一行: public sta
通读here并查看示例 here : 我试图了解 WebSocketAccept 实际上做了什么。我知道 WebSocketAccept 是: using WebSocketAccept =
以下代码复制自 Asp.Net Identity 2.0 示例。 private ApplicationUserManager _userManager; public ApplicationUser
我正在开发一个 Web 应用程序,我希望能够通过我的 IUserContext 接口(interface)访问当前登录的用户。看起来像这样: public interface IUserContext
我在将 MembershipReboot 与新的 ASP MVC5 模板和 Autofac 一起使用时遇到问题。我使用默认的 MVC5 模板来设置站点,然后尝试连接 MembershipReboot
如果我使用 OwinMiddleware 和 IOwinContext 等 Microsoft.Owin 类型构建 OWIN 中间件,我的中间件是否可以与非 Microsoft Owin 主机/服务器
我正在尝试向我的项目添加个人资料图片,我正在关注这篇文章 https://social.technet.microsoft.com/wiki/contents/articles/34445.mvc-a
通过 Ninject 使用 Web API 2 和 OWIN 托管。 我想将当前的 IOwinContext 注入(inject)到某些服务中(这样我就可以获取请求以让主体进行一些数据过滤)。 在过去
我是一名优秀的程序员,十分优秀!