Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Signal-R如何适应IIS激活模型?_Asp.net_.net_Iis 7.5_Signalr - Fatal编程技术网

Asp.net Signal-R如何适应IIS激活模型?

Asp.net Signal-R如何适应IIS激活模型?,asp.net,.net,iis-7.5,signalr,Asp.net,.net,Iis 7.5,Signalr,我正在学习Signal-R,这是我一直在思考的问题 Signal-R如何适应IIS/ASP.NET生命周期 集线器可以使用多长时间(我看到它们具有重新连接语义) IIS是否阻止关闭具有持久连接的AppDomain 据我所知,IIS设计用于处理请求-响应场景。一个请求点击IIS,它会找到AppDomain,激活它,然后将请求传递给它。空闲时间过后,关闭AppDomain。如果请求花费的时间太长,将引发超时异常 现在让我们假设我有另一个应用程序,它通过TCP套接字广播信息。我希望我的javasc

我正在学习Signal-R,这是我一直在思考的问题

  • Signal-R如何适应IIS/ASP.NET生命周期
  • 集线器可以使用多长时间(我看到它们具有重新连接语义)
  • IIS是否阻止关闭具有持久连接的AppDomain
据我所知,IIS设计用于处理请求-响应场景。一个请求点击IIS,它会找到AppDomain,激活它,然后将请求传递给它。空闲时间过后,关闭AppDomain。如果请求花费的时间太长,将引发超时异常

现在让我们假设我有另一个应用程序,它通过TCP套接字广播信息。我希望我的javascript客户端能够实时获取这些信息,所以我创建了一个Signal-R web应用程序。我可以在应用程序启动时创建一个TCP客户端,但是什么可以保证IIS在一段时间内不活动时不会关闭整个程序

我可以在窗口服务中自行托管Signal-R应用程序,但随后我必须使用不同的端口,启用跨域等。。。部署中存在许多问题。但是,我担心使用ASP.NETMVC应用程序来实现这一点,因为在我看来,这就像在摩托车上安装驱动轮一样


干杯。

IIS/ASP.NET生命周期中的信号器

  • 信号机使用Owin:
  • 这里有一篇关于Owin的好文章:
中心对象生存期

从信号器文档:

您不需要实例化Hub类或从服务器上自己的代码调用其方法;所有这些都是由信号集线器管道为您完成的。SignalR每次需要处理集线器操作时(例如当客户端连接、断开连接或对服务器进行方法调用时),都会创建集线器类的新实例

因为Hub类的实例是暂时的,所以不能使用它们来维护从一个方法调用到下一个方法调用的状态。每次服务器接收到来自客户端的方法调用时,Hub类的新实例都会处理该消息。要通过多个连接和方法调用来维护状态,请使用其他一些方法,例如数据库、Hub类上的静态变量或不是从Hub派生的其他类。如果使用Hub类上的静态变量等方法将数据持久化到内存中,则当应用程序域回收时,数据将丢失

长时间运行的TCP客户端

这不是信号机的问题。IIS可以关闭您的TCP客户端:


我宁愿让TCP客户端在windows服务中运行。TCP客户端接收TCP广播消息,并使用SignalR.NET客户端将消息转发到集线器。

集线器会在每个SignalR请求中重新创建,因此,如果需要持久连接,则可能需要使用静态变量或字典来保持状态。但是,正如您所指出的,ASP.NET可以由于各种原因重新启动

这取决于你真正需要的毅力。如果您的连接必须始终保持活动状态,并且无法拆除和重新建立,那么在IIS中托管不是正确的选择。但是,如果您可以在关机后重新建立相同的连接,那么这可能仍然可以工作

在确保ASP.NET应用程序不会在最新版本的IIS中关闭方面,您可以做很多工作:

如果这还不足以让你作为一个独立的服务运行是一个选项。如果在同一IP地址上作为服务运行,则不存在跨域问题。以下是有关使用Windows服务运行SignalR的更多信息:


WebSocket是一个持久连接,不管是否使用静态变量。我想你可能会被持续状态弄糊涂:)