在Microsoft Edge中

时间:2018-08-23 16:11:49

标签: c# asp.net signalr microsoft-edge signalr.client

在使用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内部。

1 个答案:

答案 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