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

我正在尝试遵循此tutorial

我遇到的问题是处理从ApiController继承的Get请求的 Controller ,而我正在尝试执行以下操作:

 if (HttpContext.Current.IsWebSocketRequest)
    {
        HttpContext.Current.AcceptWebSocketRequest(SomeFunction);
    }
    return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);

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

我的 Controller 和我要执行的操作:
    [HttpGet]
    public HttpResponseMessage GetSomething()
    {
        if (HttpContext.Current.IsWebSocketRequest()){
             Console.WriteLine("web socket request..");
        }
    }

^ HttpContext.Current始终为null。我的 Controller 仅继承自ApiController

最佳答案

要访问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);
                }
            }
        }

如果提供的话,这将使HttpContext脱离请求。

09-10 10:37
查看更多