【发布时间】:2017-01-15 19:13:47
【问题描述】:
部署到 Azure 时,SignalR 在 localhost 上不起作用,但部署到 Azure 时不起作用
在执行信号器/协商请求时,它会以 500 内部服务器错误响应进行响应。
手动导航到协商 url,我得到了更详细的错误解释。
'CryptographicException: 数据保护操作不成功...'
使用 IISExpress 在本地一切正常。
我该如何解决这个问题?
【问题讨论】:
部署到 Azure 时,SignalR 在 localhost 上不起作用,但部署到 Azure 时不起作用
在执行信号器/协商请求时,它会以 500 内部服务器错误响应进行响应。
手动导航到协商 url,我得到了更详细的错误解释。
'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 { 公共 IDataProtector 创建(参数字符串 [] 用途) { 返回新的 MachineKeyDataProtector(用途); } }
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;
}
}
【讨论】: