1

我需要实现一个简单的工作人员集群,它可以创建包含大量 pdf 的文件 zip 文件。架构,现在看起来像这样:

  1. 单个客户端(WebAPI + AngularJS)
  2. 完成这项工作的 Hangfire 服务器集群

一旦客户端请求一个新的 zip 文件,该请求就会在 Hangfire 队列中排队。当集群中的一个节点空闲时,作业将启动。在作业执行期间,客户端将收到有关进度的通知。既然是集群,就需要另外一个组件:

  1. 一个所谓的SignalR 背板,用于处理工作人员和客户端之间的通信

我使用 Redis 来实现这个组件,感谢一些 NuGet 包(即Microsoft.AspNet.SignalRMicrosoft.AspNet.SignalR.Redis)和这个文档,这非常简单,我唯一需要做的就是在 Owin 启动文件中添加一些新行;一个给工人:

public class WorkerStartup
{
    public void Configuration(IAppBuilder app)
    {
       GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDB");
       GlobalHost.DependencyResolver.UseRedis("IP", 6379, String.Empty, "TOPIC");

       app.MapSignalR();
       app.UseHangfireServer();
    }
}

一个用于 WebAPI,它们是平等的,但 Hangfire 配置:

public class ClientStartup
{
    public void Configuration(IAppBuilder app)
    {
       GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDB");
       GlobalHost.DependencyResolver.UseRedis("IP", 6379, String.Empty, "TOPIC");

       app.MapSignalR();
       app.UseHangfireDashboard(); // The client only needs Hangfire dashboard
    }
}

它就像一个魅力,Redis 做得很好。我会尝试使用 Azure 服务总线(基于此处的链接)重新实现所有内容,我将包Microsoft.AspNet.SignalR.Redis替换Microsoft.AspNet.SignalR.ServiceBus为以下行UseRedis

GlobalHost.DependencyResolver.UseServiceBus("Endpoint=sb://XXX.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXX", "TOPIC");

但是一旦我开始客户端/服务器通信,我就会得到:

无法成功初始化任何传输。尝试为自动初始化指定不同的传输或根本不指定。”

怎么了,应该没问题。。。

4

1 回答 1

1

无法成功初始化任何传输。尝试为自动初始化指定不同的传输或根本不指定。

要解决此问题,您可以启用跟踪并登录您的 hub,您可以在浏览器控制台选项卡中查看您的应用程序正在使用哪种传输方式。

$.connection.hub.logging = true;

然后您可以尝试在客户端连接启动时显式指定不同的传输并测试它是否有效。

$.connection.hub.start({ transport: 'specify transport that you want' })

目前,支持以下传输:

  • 网络套接字
  • 服务器发送
  • Events Forever Frame(仅适用于 Internet Explorer)
  • Ajax 长轮询
于 2017-03-31T03:26:27.940 回答