404 / signalr /协商在Azure中部署的应用程序

时间:2016-10-06 13:28:48

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

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 for url:

的https://(的名称).azurewebsites.com / signalr /谈判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

1 个答案:

答案 0 :(得分:1)

要找出问题的真正原因,您需要导航到协商网址,并查找响应。

如果回复告诉您有关' 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);
            });


        });