使用Azure Servicebus背板时出现奇怪的间歇性SignalR故障

时间:2015-06-01 00:15:42

标签: azure signalr azureservicebus

当使用SignalR 2.2.0并使用带有某些Azure Service Bus实例的Microsoft ASP.NET SignalR Service Bus Messaging Backplane 时,我们在开发和生产环境中看到了奇怪的行为。一些服务总线似乎腐败并堵塞,我们看到下面描述的问题。

首先,这是我的OWIN启动代码:

public void Configuration(IAppBuilder app)
{
    string connectionString = System.Configuration.ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];
    GlobalHost.DependencyResolver.UseServiceBus(connectionString, "MyApplicationName");

    // Branch the pipeline here for requests that start with "/signalr"
    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        var hubConfiguration = new HubConfiguration
        {
            //EnableJSONP = true,
            EnableDetailedErrors = true
        };
        map.RunSignalR(hubConfiguration);
    });
}

我们的问题的症状是SignalR使用任何传输连接的间歇性故障。与没有背板运行相比,性能较慢,并且在SignalR客户端上启用了详细日志记录,我看到消息" SignalR:webSockets传输在尝试连接时超时。"然后SignalR尝试通过剩余的传输(永远帧,长轮询),然后放弃。

这里是踢球者:对于我们的一些服务总线实例,性能坚如磐石,我们从未遇到过问题。其他服务总线实例会导致上述问题。

为什么我们有多条服务总线?我们只为我们的应用程序使用一个,但开发人员每个都有一个服务总线实例可供使用。它让我在晚上看到Azure Service Bus已经损坏,我不知道为什么。

问题:

  1. 还有其他人遇到过这个问题吗?
  2. 您是否看到Service Bus实例在SignalR或其他应用程序中损坏或行为异常?
  3. 有什么可以解释这种行为?

1 个答案:

答案 0 :(得分:1)

这是一个很老的帖子,但我们有一个非常类似的问题,让我们把头发拉出来。当我们将SignalR与Service Bus背板一起使用时,就会发生这种情况。

在我们的例外日志中,我们发现了以下内容:

  

X.509证书CN = servicebus.windows.net不在受信任范围内   人们的商店。 X.509证书CN = servicebus.windows.net链   建筑失败了。使用的证书具有信任链   无法验证。更换证书或更改   certificateValidationMode。无法构建证书链   受信任的根权威。

修复是在我们的应用启动中添加以下代码行。对我们来说,那就是global.asax.cs:

<div *ngFor="let comp of templateVals | async;let i=index">

  <md-input-container class="example-90" *ngIf="comp.type=='code'">
    <textarea rows="4"  mdInput  name="desc{{i}}" [(ngModel)]="comp.data" placeholder="Description"></textarea>
  </md-input-container>
  <md-input-container class="example-90" *ngIf="comp.type=='text'">
    <textarea rows="4"  mdInput name="text{{i}}" [(ngModel)]="comp.data" placeholder="Text"></textarea>
  </md-input-container>
  <md-input-container class="example-90" *ngIf="comp.type=='title'">
    <input mdInput name="title{{i}}" [(ngModel)]="comp.data" placeholder="Title">
  </md-input-container>
  <span class="example-90" *ngIf="comp.type=='upload'">

    <input-file *ngIf="!comp.data" [acceptId]="comp.id"  (onFileSelect)="addedFileInfo($event)"></input-file>
  <span *ngIf="comp.data">{{comp.data}}</span>

  </span>
  <span class="example-10">
  <button md-mini-fab (click)="removeThis(comp)"><md-icon>remove circle</md-icon></button>
    </span>
</div>

之后,我们的服务总线背板和SignalR完美运行。

要更深入地讨论正在发生的事情,check out this SO post