Angularjs 在控制台应用程序上的ASP.NET WebAPI中宿主WebSocket服务器
我已经构建了一个ASP.NETWebAPI,它托管在一个控制台应用程序上。我已经创建了一些web API,并且工作得很好。然后我尝试在它上面实现web套接字服务。服务器端代码如下所示Angularjs 在控制台应用程序上的ASP.NET WebAPI中宿主WebSocket服务器,angularjs,asp.net-web-api,websocket,Angularjs,Asp.net Web Api,Websocket,我已经构建了一个ASP.NETWebAPI,它托管在一个控制台应用程序上。我已经创建了一些web API,并且工作得很好。然后我尝试在它上面实现web套接字服务。服务器端代码如下所示 [RoutePrefix("api/notification")] public class NotificationController : ApiController { [HttpGet] [Route("")] public HttpResponseMessage Get()
[RoutePrefix("api/notification")]
public class NotificationController : ApiController
{
[HttpGet]
[Route("")]
public HttpResponseMessage Get()
{
if (HttpContext.Current.IsWebSocketRequest)
{
HttpContext.Current.AcceptWebSocketRequest(new NotificationWebSocketHandler());
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
public class NotificationWebSocketHandler : WebSocketHandler
{
private static WebSocketCollection _clients;
static NotificationWebSocketHandler()
{
_clients = new WebSocketCollection();
Task.Factory.StartNew(() =>
{
while (true)
{
Task.Delay(TimeSpan.FromSeconds(5));
if (_clients.Count > 0)
{
_clients.Broadcast(Guid.NewGuid().ToString());
}
}
});
}
public override void OnOpen()
{
_clients.Add(this);
Console.WriteLine("Web socket client opened, client count = {0}", _clients.Count);
}
public override void OnClose()
{
_clients.Remove(this);
Console.WriteLine("Web socket client closed, client count = {0}", _clients.Count);
}
}
}
但是当我打开客户端页面(它是在AngularJS上构建的)时,我收到了错误消息说WebSocket连接到'ws://10.222.115.220:8080/api/notification/'失败:WebSocket握手时出错:意外响应代码:500
我的客户端代码是
app.shared.controllers.controller('DashboardCtrl', function ($q, $scope) {
var ws = new WebSocket("ws://10.222.115.220:8080/api/notification/");
ws.onopen = function () {
console.log('web socket opened');
}
ws.onmessage = function (message) {
$scope.seed = message;
};
$scope.seed = '(empty)';
});
当我附加了debug并在我的Get
函数的入口添加了一个断点时,我发现在没有命中该断点的情况下引发了错误500。我认为这意味着错误是由WebAPI内部生成的
我不确定我的代码中是否有错误,或者WebSocket功能不支持console应用程序主机。您正在“自主机”模式下使用Web API?(托管在控制台中) 这里有一个问题,对象HttpContext.Current为“null”。 这是一个自我托管的问题。HttpContext.Current是在使用IIS(web主机)时设置的。此属性在自托管期间不可用。我想这可能是你的问题。(web api应用程序中会引发null ref异常,并返回500-内部服务器错误)