如何使用Azure辅助角色和OWIN扩展SignalRSignalR使用AzureWeb角色非常精确地扩展。但是,当我在Azure工作者角色中使用自托管OWIN项目时,SignalR将开始出现添加多个实例的问题。作为记录,我的项目使用Redis作为背板。将AzureWorker实例增加到多个时,客户端连接将随机失败并出现错误“ConnectionId格式不正确”。我认为这是由于负载平衡导致单个客户端的协商跨越多个服务器时造成的;我不相信参与协商的多个服务器可以解密数据(幕后的DPAPI?)。我试过在app.config中设置validationKey和decryptionKey,但这似乎没有什么区别;问题仍然存在。此外,该项目将作为Web角色(IIS)正常工作,但不能作为辅助角色(OWIN自托管)。假设这是DpapiDataProtectionProvider的问题,我如何确保提供程序在多个服务器/实例中呈现相同的加密/解密结果?解决方案SignalR(DpapiDataProtectionProvider)使用的默认保护提供程序似乎不支持AzureWorkerRolescaleout。通过滚动我自己的示例提供程序,我能够扩展SignalR/OWIN/AzureWorker而不是随机获得400HTTP/“ConnectionId格式不正确”。请记住,以下示例不会保护/保护令牌。publicclassExampleDataProvider:IDataProtector{publicbyte[]Protect(byte[]userData){Trace.TraceInformation("Protectcalled:"+Convert.ToBase64String(userData));返回用户数据;}publicbyte[]Unprotect(byte[]protectedData){Trace.TraceInformation("Unprotectcalled:"+Convert.ToBase64String(protectedData));返回受保护的数据;}}publicclassExampleProtectionProvider:IDataProtectionProvider{publicIDataProtectorCreate(paramsstring[]purposes){Trace.TraceInformation("ExampleProtectionProviderCreated");返回新的ExampleDataProvider();}}在Owin启动期间注册自定义提供程序:publicclassStartup{publicvoidConfiguration(IAppBuilderapp){app.SetDataProtectionProvider(newExampleProtectionProvider());GlobalHost.DependencyResolver.UseRedis(newRedisScaleoutConfiguration("0.0.0.0",0,"","示例"));app.MapSignalR(newHubConfiguration{EnableDetailedErrors=true});app.UseWelcomePage("/");}}SignalR使用来自IAppBuilderIDataProtectionProviderfor.Properties["security.DataProtectionProvider"],如果不为null可以在调用MapSignalR之前在Startup.Configuration中用自己的IDataProtectionProvider替换。通过提供您自己的IDataProtectionProvider,您可以确保每个工作者角色都使用相同的密钥受到保护/不受保护。以上就是C#学习教程:HowtouseAzureWorkerRoleandOWIN展开SignalR分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
