部署到Azure时,SignalR无法在localhost上运行,但在部署到Azure时不起作用
在执行signalr / negotiate请求时,它会响应500内部服务器错误响应。
手动导航到协商网址,我得到了更详细的错误说明。 'CryptographicException:数据保护操作不成功......'
使用IISExpress,一切都在本地工作正常。
我该如何解决?
我认为这是解决方案。这对我没有任何代码更改:
Azure WebApps配置为默认情况下不加载用户配置文件,这会导致异常。在Azure应用程序设置中,创建名为WEBSITE_LOAD_USER_PROFILE的应用程序设置并将其设置为1.这将加载用户配置文件。
搞定了。我需要使用appBuilder.SetDataProtectionProvider
app.UseAppBuilder(appBuilder =>
{
appBuilder.SetDataProtectionProvider(new MachineKeyProtectionProvider());
appBuilder.Map("/signalr", map =>
{
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true
};
map.RunSignalR(hubConfiguration);
});
});
我使用katana扩展方法将IAppBuilder桥接到IApplicationBuilder。这允许您的owin中间件连接到asp.net核心。使用RunSignalr方法很重要。
内部类MachineKeyProtectionProvider:IDataProtectionProvider {public IDataProtector Create(params string [] purpose){return new MachineKeyDataProtector(purpose); }}
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;
}
}