【问题标题】:404 /signalr/negotiate for deployed app in Azure404 /signalr/negotiate 在 Azure 中部署的应用程序
【发布时间】:2017-02-15 06:43:45
【问题描述】:

SignalR 在 localhost 上工作,但在 Azure 中部署时不起作用

Asp.net Core 1.0.0 (.Net Framework 4.6.1)

SignalR.Core 2.2.1

public static void UseSignalR2(this IApplicationBuilder app)
    {
        app.UseAppBuilder(appBuilder => {
            appBuilder.MapSignalR(new HubConfiguration());
        });
        GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
        GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule());
    }

使用默认设置的 SignalR.js 2.2.1

$.connection.hub.url = '/signalr';

预期行为

网址为 200:

https://(name).azurewebsites.com/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22productsimporthub%22%7D%5D&_= 1472811629592

实际行为

/signalr/negotiate - 在 localhost 上返回 200,但在 azure 中部署的应用程序返回 404

/signalr - 两者都适用 - 协议错误:未知传输。

/signalr/hubs - 适用于两者 - 正确返回 SignalR js

【问题讨论】:

  • 你有没有发现这是什么,我只有在部署到 Azure 时才会遇到类似的问题

标签: azure model-view-controller asp.net-core signalr http-status-code-404


【解决方案1】:

要找出问题的真正原因,您需要导航到协商 URL,然后查找响应。

如果响应告诉您有关“CryptographicException:数据保护操作不成功...”的信息。这是修复它的方法。

1) 创建自定义 IDataProtectionProvider
2) 配置信号器

internal class MachineKeyProtectionProvider : IDataProtectionProvider
{
    public IDataProtector Create(params string[] purposes)
    {
        return new MachineKeyDataProtector(purposes);
    }
}

internal class MachineKeyDataProtector : IDataProtector
{
    private readonly string[] _purposes;

    public MachineKeyDataProtector(string[] purposes)
    {
        _purposes = purposes;
    }

    public byte[] Protect(byte[] userData)
    {
        //return MachineKey.Protect(userData, _purposes);
        return userData;
    }

    public byte[] Unprotect(byte[] protectedData)
    {
        //return System.Web.Security.MachineKey.Unprotect(protectedData, _purposes);
        return protectedData;
    }
}


我使用 katana 扩展方法 将 IAppBuilder 连接到 IApplicationBuilder。 这允许您的 owin 中间件连接到 asp.net 核心。使用 RunSignalr 方法很重要

app.UseAppBuilder(appBuilder =>
        {
            appBuilder.SetDataProtectionProvider(new MachineKeyProtectionProvider());

            appBuilder.Map("/signalr", map =>
            {
                var hubConfiguration = new HubConfiguration
                {
                    EnableDetailedErrors = true
                };

                map.RunSignalR(hubConfiguration);
            });


        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2014-04-29
    • 2017-09-09
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多