我正在开发一个Web应用程序,我在特定页面上使用两个集线器将通知从服务器推送到客户端并在客户端之间处理消息。但是,我遇到了Azure生产应用服务的一个场景,即使查询带来了正确的数据,通知中心也不会将数据传回客户端。
客户代码:
// Declare a proxy to reference the hub.
var notifHub = $.connection.NotificationHub;
var chat = $.connection.ChatHub;
var maxTabs = 10, index = 1;
// Start the connection.
$.connection.hub.start().done(function () {
notifHub.server.getNotifications();
/* Some more code irrelevant to this question */
});
notifHub.client.getNotifications = function (notification) {
// Html encode display name and message.
const notifications = JSON.parse(notification);
// Add the message to the page.
$("#Notifications").empty();
notifications.forEach(function (notification) {
const notificationDate = new Date(notification.CreationDate);
let alertColor = "";
if (((new Date) - notificationDate) < oneMinute)
alertColor = "alert-success";
else if (((new Date) - notificationDate) > oneMinute &&
((new Date) - notificationDate) < fiveMinutes)
alertColor = "alert-warning";
else if (((new Date) - notificationDate) > fiveMinutes)
alertColor = "alert-danger";
//language=html
var notificationTemplate = "<div class ='alert " + alertColor + "' role='alert' data-request-id='{{RequestId}}' data-connection-id='{{ConnectionId}}' data-requester='{{RequesterName}}' data-group-name='{{RequesterGroup}}' data-request-date-time='{{CreationDate}}'><strong>Usuario</strong>: {{RequesterName}}<br /><strong>Fecha</strong>: {{CreationDate | datetime}}</div>";
$("#Notifications").append(Mustache.render(notificationTemplate, notification));
});
};
中心代码
public void GetNotifications()
{
var db = new Entities();
db.Database.Log = s => Debug.WriteLine(s);
var companyId = Context.User.Identity.GetCompanyId();
var notifications = (from notification in db.AgentRequestNotification
where notification.AttendedByAgent == false && notification.CompanyId == companyId
orderby notification.CreationDate
select notification).ToList();
Clients.All.getNotifications(JsonConvert.SerializeObject(notifications));
}
代码在我的本地环境中完美运行,如以下屏幕截图所示
但不是生产环境
在我的Azure App设置上,我启用了Websockets并禁用了ARR Affinity。我有 使用VS进行远程调试,这是我得到的输出,不确定导致EF查询日志后显示的WebSocketException是什么
Opened connection at 1/15/2018 9:03:46 PM +00:00
SELECT
[Project1].[RequestId] AS [RequestId],
[Project1].[ConnectionId] AS [ConnectionId],
[Project1].[RequesterName] AS [RequesterName],
[Project1].[RequesterGroup] AS [RequesterGroup],
[Project1].[AttendedByAgent] AS [AttendedByAgent],
[Project1].[CreationDate] AS [CreationDate],
[Project1].[CompanyId] AS [CompanyId],
[Project1].[AttendedByAgentDate] AS [AttendedByAgentDate]
FROM ( SELECT
[Extent1].[RequestId] AS [RequestId],
[Extent1].[ConnectionId] AS [ConnectionId],
[Extent1].[RequesterName] AS [RequesterName],
[Extent1].[RequesterGroup] AS [RequesterGroup],
[Extent1].[AttendedByAgent] AS [AttendedByAgent],
[Extent1].[CreationDate] AS [CreationDate],
[Extent1].[CompanyId] AS [CompanyId],
[Extent1].[AttendedByAgentDate] AS [AttendedByAgentDate]
FROM [dbo].[AgentRequestNotification] AS [Extent1]
WHERE (0 = [Extent1].[AttendedByAgent]) AND ([Extent1].[CompanyId] = @p__linq__0)
) AS [Project1]
ORDER BY [Project1].[CreationDate] ASC
-- p__linq__0: '1' (Type = Int32, IsNullable = false)
-- Executing at 1/15/2018 9:03:49 PM +00:00
-- Completed in 25 ms with result: SqlDataReader
Closed connection at 1/15/2018 9:03:49 PM +00:00
The thread 0x1520 has exited with code 0 (0x0).
The thread 0x2904 has exited with code 0 (0x0).
Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll
Exception thrown: 'System.Net.WebSockets.WebSocketException' in System.Web.dll
Exception thrown: 'System.Net.WebSockets.WebSocketException' in mscorlib.dll
Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll
Exception thrown: 'System.Net.WebSockets.WebSocketException' in mscorlib.dll
Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll
Exception thrown: 'System.Net.WebSockets.WebSocketException' in System.Web.dll
Exception thrown: 'System.Data.SqlClient.SqlException' in mscorlib.dll
Exception thrown: 'System.Net.WebSockets.WebSocketException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in EntityFramework.dll
Exception thrown: 'System.Net.WebSockets.WebSocketException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in EntityFramework.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
w3wp.exe Error: 0 : Error while closing the websocket: System.Net.WebSockets.WebSocketException (0x800704CD): An operation was attempted on a nonexistent network connection
at System.Web.WebSockets.WebSocketPipe.<>c__DisplayClass8_0.<WriteCloseFragmentAsync>b__0(Int32 hrError, Int32 cbIO, Boolean fUtf8Encoded, Boolean fFinalFragment, Boolean fClose)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.WebSockets.AspNetWebSocket.<>c__DisplayClass46_0.<<DoWork>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.WebSockets.AspNetWebSocket.<DoWork>d__45`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.WebSockets.AspNetWebSocket.<>c__DisplayClass32_0.<<CloseOutputAsyncImpl>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNet.SignalR.WebSockets.WebSocketHandler.<>c.<<CloseAsync>b__13_0>d.MoveNext()
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in EntityFramework.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in EntityFramework.SqlServer.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in Microsoft.Owin.Security.Cookies.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in mscorlib.dll
Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in Microsoft.Owin.Host.SystemWeb.dll
The thread 0x219c has exited with code 0 (0x0).
这是SignalR客户端日志
[17:56:53 GMT-0500 (Eastern Standard Time)] SignalR: No hubs have been subscribed to. The client will not receive data from hubs. To fix, declare at least one client side function prior to connection start for each hub you wish to subscribe to.
[17:56:53 GMT-0500 (Eastern Standard Time)] ignalR: Negotiating with '/signalr/negotiate? clientProtocol=1.5&connectionData=%5B%5D'.
[17:56:53 GMT-0500 (Eastern Standard Time)] SignalR: webSockets transport starting.
[17:56:53 GMT-0500 (Eastern Standard Time)] SignalR: Connecting to websocket endpoint 'ws://samiweb.azurewebsites.net/signalr/connect? transport=webSockets&clientProtocol=1.5&connectionToken=yKn2ns1bOenZLiUtCiOSSfQg YCl%2FyVAvxKejSZx2x0svkyzIJJ85qjNMk7IBjy8Nes0Lg9W%2BUTAPW21z6rVHTwXbb4wxaZhVwn1J vzrNra0WhYCuXMiu6kLYs0FWuRUy&connectionData=%5B%5D&tid=1'.
[17:56:54 GMT-0500 (Eastern Standard Time)] SignalR: Websocket opened.
[17:56:54 GMT-0500 (Eastern Standard Time)] SignalR: webSockets transport connected. Initiating start request.
[17:56:54 GMT-0500 (Eastern Standard Time)] SignalR: The start request succeeded. Transitioning to the connected state.
[17:56:54 GMT-0500 (Eastern Standard Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
[17:56:54 GMT-0500 (Eastern Standard Time)] SignalR: Invoking saminotificationhub.GetNotifications
[17:56:54 GMT-0500 (Eastern Standard Time)] SignalR: Invoked saminotificationhub.GetNotifications
任何帮助将不胜感激!
答案 0 :(得分:2)
从SignalR客户端日志:
尚未订阅任何中心。客户端不会从集线器接收数据。要修复,请在连接开始之前为您要订阅的每个集线器声明至少一个客户端功能。
AFAIK,正常的客户端日志如下所示:Client subscribed to hub 'notificationhub'
。您可以尝试在$.connection.hub.start()
之前声明客户端方法。