将OwinHttpRequestContext转换为HttpContext?(IHttpHandler和websockets)

use*_*172 12 .net c# sockets http websocket

我正在尝试在我的应用程序中实现Web套接字,该套接字当前实现了RESTful Web API.我希望能够通过Web套接字连接公开某些信息,因此我试图弄清楚如何将正常的HTTP请求升级到Web套接字连接.

我正在尝试按照本教程

我遇到的问题是我的控制器处理从ApiController继承的Get请求,我正在尝试这样做:

 if (HttpContext.Current.IsWebSocketRequest)
    {
        HttpContext.Current.AcceptWebSocketRequest(SomeFunction);
    }
    return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
Run Code Online (Sandbox Code Playgroud)

问题是我的HttpContext.Current总是为null,我不知道为什么.似乎没有HttpContext这样的东西.然而,我确实从请求中看到它们是一个带有请求的HttpRequestContext.这两个对象是否完全相关,是否有任何方法可以访问.IsWebSocketRequest方法,以便我可以尝试将请求升级到Web套接字连接?

我的控制器和我想做的事情:

    [HttpGet]
    public HttpResponseMessage GetSomething()    
    {
        if (HttpContext.Current.IsWebSocketRequest()){
             Console.WriteLine("web socket request..");  
        }
    }
Run Code Online (Sandbox Code Playgroud)

^ HttpContext.Current始终为null.我的控制器仅从ApiController继承

Bri*_*arm 3

要访问 MVC ApiController 中的 Httpcontext,请使用此代码。

        if (Request.Properties.ContainsKey("MS_HttpContext"))
        {
            HttpContextWrapper HttpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"];
            if (HttpContext != null)
            {
                if (HttpContext.IsWebSocketRequest)
                {
                    HttpContext.AcceptWebSocketRequest(SomeFunction);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果提供了 HttpContext,这将从请求中获取 HttpContext。

  • 它不包含“MS_HttpContext”。我在 Request.Properties 下看到的有“MS_OwinContext”、“MS_RequestContext”、“MS_HttpConfiguration”、“MS_RoutingContext”、“MS_HttpRouteData”和其他一些 (2认同)