SignalR 更新无法与 Chrome 一起正常工作
SignalR updates not working correctly with Chrome
我创建了一个带有 SignalR 通知的 ASP MVC 4 应用程序。我 运行 它在本地调试模式下,也通过 IIS 在服务器上发布。当使用 Internet Explorer 11 时,这主要(稍后解释)按预期工作:
HTML1300: Navigation occurred.
File: AllChanges
SignalR: Window unloading, stopping the connection.
SignalR: Stopping connection.
SignalR: Stopping forever frame.
SignalR: Fired ajax abort async = false.
SignalR: Stopping the monitoring of the keep alive.
JQMIGRATE: Migrate is installed, version 3.0.0
SignalR: Client subscribed to hub 'prismhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: This browser doesn't support SSE.
SignalR: serverSentEvents transport failed to connect. Attempting to fall back.
SignalR: foreverFrame transport starting.
SignalR: Binding to iframe's load event.
SignalR: Iframe transport started.
SignalR: foreverFrame transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
Connected to signalR hub
SignalR: foreverFrame transport timed out when trying to connect.
**SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.**
Chrome 中的通知似乎不起作用。在日志中,我可以看到 SignalR 正在推送通知:
SignalR: Window unloading, stopping the connection.
SignalR: Stopping connection.
SignalR: EventSource calling close().
SignalR: Fired ajax abort async = false.
SignalR: Stopping the monitoring of the keep alive.
JQMIGRATE: Migrate is installed, version 3.0.0
SignalR: Client subscribed to hub 'prismhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: Attempting to connect to SSE endpoint 'http://localhost:61159/signalr/connect?transport=serverSentEvents&clientPro…FNE6BKzqphux4&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D&tid=9'.
SignalR: EventSource connected.
SignalR: serverSentEvents transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
Connected to signalR hub
**SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.
SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.
SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.**
但我认为数据没有变化(就像在 Internet Explorer 中一样)。这个问题在IE中偶尔会出现。此外,刷新页面似乎会中断集线器连接。来自 IE 控制台:
HTML1300: Navigation occurred.
File: AllChanges
JQMIGRATE: Migrate is installed, version 3.0.0
SignalR: Client subscribed to hub 'prismhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: This browser doesn't support SSE.
SignalR: serverSentEvents transport failed to connect. Attempting to fall back.
SignalR: foreverFrame transport starting.
SignalR: Binding to iframe's load event.
SignalR: Iframe transport started.
SignalR: foreverFrame transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
Connected to signalR hub
SignalR: foreverFrame transport timed out when trying to connect.
值得注意的是,这些请求对使用 linq 查询访问数据库的控制器进行 ajax 调用,返回数据列表:
查看JS
$(document).ready(function () {
FetchChanges();
notifications.client.sendUpdatedChange = function () { FetchChanges(); };
}
function FetchChanges() {
var model = $('#divChanges');
$.ajax({
url: '/Changes/AllChangesItems',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
dataType: 'html',
})
.done(function (result) {
model.empty().append(result);
})
}
控制器操作
public ActionResult AllChangesItems()
{
var username = CurrentUser().UserName;
var changes = db.Changes;
List<ChangeListingViewModel> vm = new List<ChangeListingViewModel>();
foreach (var c in changes)
{
vm.Add(new ChangeListingViewModel(c));
}
return PartialView("_ActiveItems", vm.ToList());
}
其中 ChangeListingViewModel 包含两个获取子行的 linq 查询(如果相关可以提供代码):
然而,'simpler' 查询似乎在 IE 和 Chrome 中运行良好,即推送通知触发更新视图的 JS 函数:
public void PinChange(int id)
{
CurrentUserDetails().User.PinnedChanges.Add(db.Changes.Find(id));
db.SaveChanges();
PrismHub.NotifyPinnedChange();
}
我的第一个想法是发生了某种超时,但我不确定为什么浏览器之间会有所不同。任何建议将不胜感激。
编辑:更新了集线器信息
编辑 2:更新集线器方法以与其他片段保持一致。
这是我中心的片段 class:
中心
[HubName("prismHub")]
public class PrismHub : Hub
{
private static IHubContext context = GlobalHost.ConnectionManager.GetHubContext<PrismHub>();
[HubMethodName("notifyUpdatedChange")]
public static void NotifyUpdatedChange()
{
context.Clients.All.sendUpdatedChange();
}
}
无意中发现了解决方案。经过几周的搜索,我遇到了这个 post: signalr client hub events not being triggered within a jquery .ready() method
此问题已通过解决视图中的这段 JS 得到解决:
$(document).ready(function () {
FetchChanges();
notifications.client.sendUpdatedChange = function () { FetchChanges(); };
}
将 SignalR 函数映射移到 $(document).ready() 之外解决了它:
$(document).ready(function () {
FetchChanges();
}
notifications.client.sendUpdatedChange = function () { FetchChanges(); };
我还没有发现为什么这是一个问题,但我很高兴找到了解决方案。
我创建了一个带有 SignalR 通知的 ASP MVC 4 应用程序。我 运行 它在本地调试模式下,也通过 IIS 在服务器上发布。当使用 Internet Explorer 11 时,这主要(稍后解释)按预期工作:
HTML1300: Navigation occurred.
File: AllChanges
SignalR: Window unloading, stopping the connection.
SignalR: Stopping connection.
SignalR: Stopping forever frame.
SignalR: Fired ajax abort async = false.
SignalR: Stopping the monitoring of the keep alive.
JQMIGRATE: Migrate is installed, version 3.0.0
SignalR: Client subscribed to hub 'prismhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: This browser doesn't support SSE.
SignalR: serverSentEvents transport failed to connect. Attempting to fall back.
SignalR: foreverFrame transport starting.
SignalR: Binding to iframe's load event.
SignalR: Iframe transport started.
SignalR: foreverFrame transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
Connected to signalR hub
SignalR: foreverFrame transport timed out when trying to connect.
**SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.**
Chrome 中的通知似乎不起作用。在日志中,我可以看到 SignalR 正在推送通知:
SignalR: Window unloading, stopping the connection.
SignalR: Stopping connection.
SignalR: EventSource calling close().
SignalR: Fired ajax abort async = false.
SignalR: Stopping the monitoring of the keep alive.
JQMIGRATE: Migrate is installed, version 3.0.0
SignalR: Client subscribed to hub 'prismhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: Attempting to connect to SSE endpoint 'http://localhost:61159/signalr/connect?transport=serverSentEvents&clientPro…FNE6BKzqphux4&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D&tid=9'.
SignalR: EventSource connected.
SignalR: serverSentEvents transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
Connected to signalR hub
**SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.
SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.
SignalR: Triggering client hub event 'sendUpdatedChange' on hub 'prismHub'.**
但我认为数据没有变化(就像在 Internet Explorer 中一样)。这个问题在IE中偶尔会出现。此外,刷新页面似乎会中断集线器连接。来自 IE 控制台:
HTML1300: Navigation occurred.
File: AllChanges
JQMIGRATE: Migrate is installed, version 3.0.0
SignalR: Client subscribed to hub 'prismhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22prismhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: This browser doesn't support SSE.
SignalR: serverSentEvents transport failed to connect. Attempting to fall back.
SignalR: foreverFrame transport starting.
SignalR: Binding to iframe's load event.
SignalR: Iframe transport started.
SignalR: foreverFrame transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
Connected to signalR hub
SignalR: foreverFrame transport timed out when trying to connect.
值得注意的是,这些请求对使用 linq 查询访问数据库的控制器进行 ajax 调用,返回数据列表:
查看JS
$(document).ready(function () {
FetchChanges();
notifications.client.sendUpdatedChange = function () { FetchChanges(); };
}
function FetchChanges() {
var model = $('#divChanges');
$.ajax({
url: '/Changes/AllChangesItems',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
dataType: 'html',
})
.done(function (result) {
model.empty().append(result);
})
}
控制器操作
public ActionResult AllChangesItems()
{
var username = CurrentUser().UserName;
var changes = db.Changes;
List<ChangeListingViewModel> vm = new List<ChangeListingViewModel>();
foreach (var c in changes)
{
vm.Add(new ChangeListingViewModel(c));
}
return PartialView("_ActiveItems", vm.ToList());
}
其中 ChangeListingViewModel 包含两个获取子行的 linq 查询(如果相关可以提供代码):
然而,'simpler' 查询似乎在 IE 和 Chrome 中运行良好,即推送通知触发更新视图的 JS 函数:
public void PinChange(int id)
{
CurrentUserDetails().User.PinnedChanges.Add(db.Changes.Find(id));
db.SaveChanges();
PrismHub.NotifyPinnedChange();
}
我的第一个想法是发生了某种超时,但我不确定为什么浏览器之间会有所不同。任何建议将不胜感激。
编辑:更新了集线器信息 编辑 2:更新集线器方法以与其他片段保持一致。
这是我中心的片段 class:
中心
[HubName("prismHub")]
public class PrismHub : Hub
{
private static IHubContext context = GlobalHost.ConnectionManager.GetHubContext<PrismHub>();
[HubMethodName("notifyUpdatedChange")]
public static void NotifyUpdatedChange()
{
context.Clients.All.sendUpdatedChange();
}
}
无意中发现了解决方案。经过几周的搜索,我遇到了这个 post: signalr client hub events not being triggered within a jquery .ready() method
此问题已通过解决视图中的这段 JS 得到解决:
$(document).ready(function () {
FetchChanges();
notifications.client.sendUpdatedChange = function () { FetchChanges(); };
}
将 SignalR 函数映射移到 $(document).ready() 之外解决了它:
$(document).ready(function () {
FetchChanges();
}
notifications.client.sendUpdatedChange = function () { FetchChanges(); };
我还没有发现为什么这是一个问题,但我很高兴找到了解决方案。