当前位置: 首页 > 面试题库 >

如何使用Azure Worker Role和OWIN缩放SignalR

轩辕炎彬
2023-03-14
问题内容

SignalR使用Azure
Web角色实现了惊人的扩展。但是,当我在Azure角色中使用自托管的OWIN项目时,添加多个实例时SignalR将开始出现问题。作为记录,我的项目使用Redis作为背板。

将Azure Worker角色实例增加到一个以上时,客户端连接将随机失败,并显示错误 “ ConnectionId格式不正确”
。我认为这是由于负载平衡而导致单个客户端的协商跨越多个服务器时引起的;我不认为参与协商的多台服务器可以解密数据(掩盖下的DPAPI?)。

我尝试在app.config中设置
validationKey和decryptionKey,但这似乎没有什么不同。问题仍然存在。同样,该项目可以很好地用作Web角色(IIS),但不能作为辅助角色(OWIN自宿主)。

假设这是DpapiDataProtectionProvider的问题,如何确保该提供程序在多个服务器/实例之间呈现相同的加密/解密结果?

SignalR(DpapiDataProtectionProvider)使用的默认保护提供程序似乎不支持Azure Worker
Role横向扩展。通过滚动自己的样本提供程序,我可以缩放SignalR / OWIN / Azure Worker,并且不会收到随机的400 HTTP /“
ConnectionId格式不正确”。请注意,以下示例不会保护/保护令牌。

public class ExampleDataProvider : IDataProtector
{
    public byte[] Protect(byte[] userData)
    {
        Trace.TraceInformation("Protect called: " + Convert.ToBase64String(userData));
        return userData;
    }

    public byte[] Unprotect(byte[] protectedData)
    {
        Trace.TraceInformation("Unprotect called: " + Convert.ToBase64String(protectedData));
        return protectedData;
    }
}

public class ExampleProtectionProvider : IDataProtectionProvider
{
    public IDataProtector Create(params string[] purposes)
    {
        Trace.TraceInformation("Example Protection Provider Created");
        return new ExampleDataProvider();
    }
}

在Owin启动期间注入自定义提供程序:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.SetDataProtectionProvider(new ExampleProtectionProvider());

        GlobalHost.DependencyResolver.UseRedis(new RedisScaleoutConfiguration("0.0.0.0", 0, "", "Example"));

        app.MapSignalR(new HubConfiguration
        {
            EnableDetailedErrors = true
        });

        app.UseWelcomePage("/");
    }
}

问题答案:

如果SignalR不为null,则使用IAppBuilder.Properties [“
security.DataProtectionProvider”]中的IDataProtectionProvider。

调用MapSignalR之前,可以在Startup.Configuration中用您自己的IDataProtectionProvider替换它。

通过提供您自己的IDataProtectionProvider,可以确保每个工作角色使用相同的密钥来保护/取消保护。



 类似资料:
  • 问题内容: 我需要实现变焦为包含在。我已经通过覆盖方法和调用来成功进行缩放。 这是不正常:对的和的规模如预期,但一定会得到的和这样的寄存器在预分频的位置。我能做什么?感谢您的阅读。 问题答案: 显示了如何使用明确的转化方法扩展鼠标坐标:,,和。)。

  • 问题内容: 当我使用angularJS单击图像本身时,如何缩放图像。当我使用以下给出的网站时,我无法做到这一点:https : //github.com/owlsomely/angular-image-zoom?utm_source=angular- js.in&utm_medium= website &utm_campaign=content- curation 。有人可以帮忙吗? 我的js文件

  • 我正在尝试缩放pdf文件,就像复印机中的缩放功能一样,它可以按百分比缩放文档(如下所示:https://inspectapedia.com/graphics/Safari_Page_Setup.jpg),我正在使用pdfbox管理我的pdf文件。我尝试过这个代码,但为什么它不起作用?代码中没有错误。 有人知道为什么该代码不起作用吗? 编辑 我需要它在API 16上工作

  • 问题内容: 我已经看过这个问题,但是它似乎并没有真正回答我的问题。我有一个图像文件,它可以是任何分辨率。我需要以特定分辨率将该图像加载到对象中(例如,对于本示例来说为800x800)。我知道Image类可以用来将图像缩放到新的大小,但是后来我不知道如何将其恢复为。是否有一种简单的方法可以将缓冲图像缩放到特定大小? NOTE II不想按特定的比例缩放图像,我想拍摄一张图像并制成特定的尺寸。 问题答案

  • 问题内容: 假设服务器获得了10,000个并发连接(通过socket.io)。太多了,如果它再也处理不了,我需要启动另一台服务器。 如何将两个服务器及其socket.io同步? 问题答案: 您可以尝试使用例如群集模块并将负载分配到多个内核(如果您有多核CPU)。如果这还不够,您可以尝试使用反向代理在多个服务器之间分配请求,并将Redis作为中央会话数据存储(如果您的方案可行)。

  • 问题内容: 我希望能够放大HTML 5画布中鼠标下方的点,例如Google Maps上的。我该如何实现? 问题答案: 终于解决了: 关键是计算轴位置,以便缩放点(鼠标指针)在缩放后保持在同一位置。 最初,鼠标与角之间有一段距离,我们希望鼠标下方的点在缩放后保持在同一位置,但这是远离角的地方。因此,我们需要移动(角的坐标)以解决此问题。 然后,其余代码需要应用缩放并转换到绘制上下文,以便其原点与画布