什么是在ASP.NET Web API应用程序中使用原始WebSockets的首选方法?
我们想要在我们的ASP.NET Web API应用程序的一些接口上使用二进制WebSockets。我很难确定应该如何做到这一点,因为似乎有几个冲突和/或过时的.NET实现在线上。
有一些看起来像ASP.NET的示例,比如这个,但我认为必须有一种方法可以在Web API框架内使用websockets,就像我们知道您可以在WebAPI中使用Signalr一样。
我本以为可以使用Microsoft.AspNet.SignalR.WebSockets.WebSocketHandler,但我不确定如何将WebSocketHandler链接到控制器...
我们想要在我们的ASP.NET Web API应用程序的一些接口上使用二进制WebSockets。我很难确定应该如何做到这一点,因为似乎有几个冲突和/或过时的.NET实现在线上。
有一些看起来像ASP.NET的示例,比如这个,但我认为必须有一种方法可以在Web API框架内使用websockets,就像我们知道您可以在WebAPI中使用Signalr一样。
我本以为可以使用Microsoft.AspNet.SignalR.WebSockets.WebSocketHandler,但我不确定如何将WebSocketHandler链接到控制器...
class MyServiceController : ApiController
{
[HttpGet]
public HttpResponseMessage SwitchProtocols (string param)
{
HttpContext currentContext = HttpContext.Current;
if (currentContext.IsWebSocketRequest ||
currentContext.IsWebSocketRequestUpgrading)
{
// several out-dated(?) examples would
// use 'new MySocketHandler' for ???
var unknown = new ????
currentContext.AcceptWebSocketRequest(unknown);
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
}
}
}
class MySocketHandler : WebSocketHandler
{
public MySocketHandler(): base(2048){}
...
}
不幸的是,AcceptWebSocketRequest现在不再接受WebSocketHandler作为参数,而是有一个新的签名...
public void AcceptWebSocketRequest(Func<AspNetWebSocketContext, Task> userFunc)
有没有人有一个链接或一个快速示例,可以在ASP.NET Web API应用程序中实现原始Websockets,并且是最新的?
Get
方法需要在if
块后面加上返回语句,并且 lambda 中的await
需要在 lambda 上加上async
修饰符。 - Drew NoakesTask.Run
可能不是最好的选择(例如,您会收到编译器警告)。我最终创建了ReadTest(WebSocket)
和WriteTask(WebSocket)
,并使用await Task.WhenAll(ReadTask(ws), WriteTask(ws))
并行运行它们。 - Ivan Krivyakov