c# - SignalR 在一台计算机上工作,但不能在其他计算机上工作

标签 c# signalr

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

如果我在笔记本电脑上访问此链接,它会起作用:

https://localhost/signalr/negotiate

回应: { “网址”:“/信号”, "ConnectionToken":"AQAAANCMnd8BFdERjHoAwE/...==", "ConnectionId":"0a09e290-c8af-48d6-b791-f05e3b8930b0", “保持事件超时”:20.0, “断开超时”:30.0, “连接超时”:110.0, “TryWebSockets”:假, "协议(protocol)版本":"1.2", “传输连接超时”:5.0, “长轮询延迟”: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();
        }
    }

最佳答案

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

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

  1. 专门为此目的在 IIS 中创建了证书:

enter image description here

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

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

netsh http delete sslcert 0.0.0.0:443

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

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

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

注意:Rick Strahl 的博客说总是使用那个 appid。我不知道 appid 在证书的上下文中意味着什么。所以,是的,无论如何...

  1. 运行我的应用并成功连接:

enter image description here

enter image description here

enter image description here

注意:我需要使用真实证书并信任它,这样我就不会再收到该警告。但这不是这个答案的重点。我只是想展示我是如何使用 SignalR 来实现这一点的。

因此,尽管这一切正常,但我不知道为什么专用于端口 443 的原始证书无法正常工作。也许它不在根存储中。我不知道如何根据 PC 上的哈希值找到该证书。

编辑

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

enter image description here

关于c# - SignalR 在一台计算机上工作,但不能在其他计算机上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059231/

相关文章:

c# - Timer Job 是这项工作的正确工具吗?

c# - 在 SignalR Core 断开事件中等待几秒钟,而不阻止存在的应用程序

某些用户的 signalr serverSentEvents 失败,但其他用户则不会

c# - 如何在 iframe 中显示本地文件夹中的 html 文件?

c# - List inside 其他列表性能

c# - DeleteOnSubmit 不存在?

c# - 我必须删除处理程序吗

c# - BlueTooth LE 4.0 (C# .NET) 的框架 (API)

jquery - 如果没有 jQuery,SignalR 是否可行?

c# - 如何从 SignalR 获取连接客户端的域