【发布时间】:2016-11-24 17:36:28
【问题描述】:
我们在 ASP.NET Web 应用程序中使用 SignalR 库。代码如下:
服务器:
[HubName("ticketsCounterHub")]
public class MassivePrintHub : Hub
{
public void PostTicketsCount(long count)
{
Clients.All.Send(count);
}
}
public class HubFactory
{
private HubFactory() {}
public static readonly HubFactory Current = new HubFactory();
public IHubProxy GetMassivePrintHubProxy()
{
var hubConnection = new HubConnection(ConfigUtils.GetRequiredSettingValue("adminPath"));
var hubProxy = hubConnection.CreateHubProxy("ticketsCounterHub");
hubConnection.Start().Wait();
return hubProxy;
}
}
客户端(JavaScript):
MassivePrintApp.controller("ListController", function ($scope, Dates) {
var hubManager = (function () {
var massivePrintHub = $.connection.ticketsCounterHub;
$.connection.hub.start();
return { massivePrintHub: massivePrintHub };
} ());
hubManager.massivePrintHub.client.Send = function (ticketsCount) {
$scope.action.Quantity = ticketsCount;
$scope.$digest();
};
});
代码的关键部分在MVC控制器中:
public FileResult PrintAction(int actionId, int count, DateTime actionDate, bool isThermo=false)
{
var ticketsCount = _ticketService.GetTicketsInStatusCount(actionId, actionDate, TicketStatusEnum.ToPrint);
HubFactory.Current.GetMassivePrintHubProxy().Invoke("PostTicketsCount", ticketsCount);
var stream = new MemoryStream();
xmlResponse.Save(stream);
stream.Flush();
stream.Position = 0;
return File(stream,ContentTypeEnum.XML.ToString(),String.Format("массовая {0} мероприятия {1} {2}шт.xml", isThermo?"термопечать":"печать", action.Artist,count));
}
如你所见,我们有这一行:
HubFactory.Current.GetMassivePrintHubProxy().Invoke("PostTicketsCount", ticketsCount);
这会导致问题,即每当我们调用它时,就会在 IIS 的“请求”部分添加一个集线器实例。
我知道我们已经在 JavaScript 代码中启动了集线器,但我不确定如何使用现有连接或如何摆脱 HubFactory 或删除创建的集线器实例。
而且我不明白为什么集线器会挂在 IIS 上。
【问题讨论】:
-
Hub 类是否与 MVC 控制器位于不同的应用程序中?如果不是,那么您可以通过 hub 上下文调用,而不是创建 hubproxy,如下所示:asp.net/signalr/overview/guide-to-the-api/…
-
MVC 控制器放置在主 ASP.NET 应用程序使用的依赖项目中。我已经尝试过以这种方式使用集线器上下文: IHubContext context = GlobalHost.ConnectionManager.GetHubContext
(); context.Clients.All.Send(ticketsCount);但是,它不起作用。也许我做错了什么。 -
Hub 也被放置在另一个项目中。
-
你不是在这里陷入僵局吗:
hubConnection.Start().Wait();? -
应该写什么?如果你写: hubConnection.Start();有错误信息:{"ErrorMessage":"连接尚未建立。","ErrorCode":1001}