在使用Microsoft Edge时,我们无法从Hub获得消息。
连接已建立,正在从客户端发送消息->服务器按预期工作,但是我们没有收到来自服务器推送的任何响应。相同的代码虽然可以在Chrome和Firefox中使用。
下面是我们正在使用的一些代码:
JS:
$.connection.hub.start()
.done(function () {
$.connection.myHub.server.broadcastMessage().done(function (data) {
console.log("broadcastMessage result: " + data); //work as expected when client request data from server, server does return the data
});
})
.fail(function () {
console.log("Connection failed!");
});
$.connection.myHub.client.showMessage = function (msg) {
alert(msg); //not working, in Microsoft Edge we're not receiving anything, this function is not triggered at all
};
C#:
public string BroadcastMessage() {
Clients.All.showMessage("ABC");
return "Hello World";
}
虽然我们并非完全无法100%地接收到任何广播,但是确实有95%的情况会发生。
尽管我们无法从服务器接收任何广播,但是来自客户端的后续请求->服务器可以正常工作。
public override Task OnConnected()
在Edge中也不会被点击,但是在Chrome / Firefox中,代码块确实会被点击。
有什么主意吗?这是SignalR或Edge的问题吗?
P / S:我们正在使用JQUERY 3.3.1和SignalR 2.3.0
更新1:
我们尝试删除所有内容,并创建了一个空项目,以查看SignalR是否存在问题。显然,如果这是一个全新的项目,SignalR不会出现此问题,但是在实施表单身份验证后,该问题开始发生,我猜测是因为某个时候服务器尝试向客户端广播消息时,它没有经过身份验证或没有设置cookie?
以下是我们用于实现表单身份验证的代码:
Global.asax
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity is FormsIdentity identity)
{
FormsIdentity id = identity;
FormsAuthenticationTicket ticket = id.Ticket;
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
}
}
Web.Config
<authentication mode="Forms">
<forms name="LoginCookie" loginUrl="/Account/Login" protection="None" path="/" defaultUrl="/Account/Login" timeout="3600" />
</authentication>
Web.Config中的代码以阻止文件夹访问
<location path="CMS/Admin" allowOverride="true">
<system.web>
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>
</location>
示例页面位于/ CMS / Admin内部。
答案 0 :(得分:-1)
尝试在以下位置更改您的C#代码:
public string BroadcastMessage() {
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<myHub>();
context.Clients.All.showMessage("ABC");
return "Hello World";
}
如果没有IHubContext context = GlobalHost.ConnectionManager.GetHubContext<myHub>();
,我将无法使用signalR