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
答案 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);
});
});