【问题标题】:IIS Background thread and SignalRIIS 后台线程和 SignalR
【发布时间】:2012-03-30 12:06:25
【问题描述】:

我需要一个后台线程来完成一些工作并将数据发送给通过 SignalR 连接到服务的用户。

我想在 IIS 中托管这个线程,并在第一次点击 Application_Start 时或在单独的工作进程中生成它。

如果我将它托管在 IIS 中并在应用程序启动时创建它 - 线程仅在第一次点击应用程序时启动。我需要它在我启动服务后立即运行。 - 我无法通过桌面 GUI 控制此线程,我无法以简单的方式停止或暂停它。

如果我将其托管在单独的进程中,例如 Windows 服务 - 我无权访问 SignalR 服务实例 - 我不想以用户身份连接到 SignalR 服务以向其他用户发送数据。我想要一种不同的方法来解决这个问题,这并不意味着工作人员是 SignalR 本身的客户。

您对此有何看法?您还有其他解决方案吗?

【问题讨论】:

  • 不希望服务充当用户的原因是什么?您希望如何在 IIS 的后台线程上连接到集线器(坏主意 imo haacked.com/archive/2011/10/16/…
  • 原因是安全和速度
  • 安全?你可以使用windows auth,Speed?客户端慢的原因是什么?

标签: c# multithreading iis signalr


【解决方案1】:

我们解决此问题的方法是在您的 Windows 服务可以调用的 Web 应用程序上创建一个单独的端点。

假设 ASP.NET MVC 控制器中存在以下 URI:http://[myserver]/api/TellUsers/[msg]。在此方法中,您可以获取已连接的集线器客户端并进行调用。

[HttpPut]
public void TellUsers(string msg)
{
   var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
   var demoClients = connectionManager.GetClients<MyHubDerivedClass>();
   demoClients.TellUsers(msg);
}

[在此处插入有关正确错误检查的警告。]

当然,您不必使用 MVC。任何可公开访问的 URI 都可以使用。至于保护它,您可以使用任何有效的技术来保护 ASP.NET 端点。

【讨论】:

    【解决方案2】:

    我知道这个问题已经很老了,但是:

    事实上,我更喜欢您的“客户本身”示例。这使您可以从许多不同的点进行控制,而不仅仅是一个点。示例 - 多个服务可以调用来控制服务。我看不出有任何理由不能让管理员用户调用其他用户不能调用的“特殊”命令。

    对于许多系统来说,这是一个久经考验的设计。我会坚持下去的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2011-01-15
      • 2020-11-07
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多