SignalR在一台计算机上工作但不在其他计算机上

时间:2016-06-27 16:48:22

标签: c# signalr

我们有一个托管SignalR的Windows服务。相同的代码在不同的机器上运行,结果不同。

如果我在笔记本电脑上访问此链接,则可以:

https://localhost/signalr/negotiate

响应: { "Url":"/signalr", "ConnectionToken":"AQAAANCMnd8BFdERjHoAwE/...==", "ConnectionId":"0a09e290-c8af-48d6-b791-f05e3b8930b0", "KeepAliveTimeout":20.0, "DisconnectTimeout":30.0, "ConnectionTimeout":110.0, "TryWebSockets":false, "ProtocolVersion":"1.2", "TransportConnectTimeout":5.0, "LongPollDelay":0.0 } 如果我在桌面上访问相同的链接,我会得到:

enter image description here

我检查了IE设置,笔记本电脑和桌面之间的TLS设置是相同的。我还检查了许多其他IE设置。

编辑:在好的PC上,在浏览器中获取证书警告。在非工作的PC上不会发生。

以下是运行SignalR的代码:

    protected override void OnStart()
    {
        LogUtility.LogInformation("SignalRHubHostController::OnStart()");

        string url = this.Application.Configuration.SignalRHubHostController.HostUrl;

        UriBuilder uri = new UriBuilder(url);

        string schemeOverride = this.Application.Configuration.SignalRHubHostController.UriSchemeOverride;

        if (!String.IsNullOrWhiteSpace(schemeOverride))
            uri.Scheme = schemeOverride;

        LogUtility.LogInformation(String.Format(CultureInfo.InvariantCulture, "Using [{0}] as the SignalR hub URL.", uri.Uri.ToString()));

        this._disposableWebServer = WebApp.Start<Startup>(uri.Uri.ToString());
    }

    internal class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }

1 个答案:

答案 0 :(得分:0)

我让这个工作。显然,现有的证书设置使用端口443是一个问题。我不知道为什么这是一个问题,但以下步骤导致事情开始为我工作。

注意:Rick Strahl的博客帮助:Hosting SignalR under SSL/https

  1. 专门为此目的在IIS中创建证书:
  2. enter image description here

    注意:我必须使用MMC将证书从个人文件夹复制到受信任的根文件夹。它已经在受信任的根文件夹中。

    1. 删除专用于端口443的现有证书:
    2.   

      netsh http delete sslcert 0.0.0.0:443

      注意:我最初尝试添加证书并收到错误,因为已经为端口443指定了证书。这就是为什么删除就在这里。

      1. 为端口443添加我的新证书:
      2.   

        netsh http add sslcert ipport = 0.0.0.0:443   APPID = {12345678-db90-4b66-8b01-88f7af2e36bf}   CERTHASH = hashGoesHere

        注意:Rick Strahl的博客说总是使用那个appid。我不知道appid在证书环境中意味着什么。所以,是的,不管......

        1. 运行我的应用并成功连接:
        2. enter image description here

          enter image description here

          enter image description here

          注意:我需要使用真正的证书并信任它,所以我不再收到警告了。但这不是这个答案的重点。我只想展示我如何使用SignalR。

          因此,虽然这使事情有效,但我不知道为什么专用于端口443的原始证书无效。也许它不在根店里。我无法弄清楚如何根据PC上的哈希值找到该证书。

          修改

          为了完整起见,我想分享一下如何获得cert哈希值。您可以通过查看IIS中的证书来手动键入它,也可以通过在MMC中查找它来复制它。它是证书的Thumbprint属性。你只需要删除空格。

          enter image description here