我们在IIS中托管了一个远程单例对象,它为多个客户端提供服务。在开发过程中,我们注意到如果一个客户端在调试器中停止,则所有其他连接的客户端将停止从服务器接收消息。消息通过事件回调传递,服务器将创建自己的线程来发送消息。我可以通过将Sleep放入客户端事件处理程序来创建相同的行为。我们在服务器上的跟踪显示对所有客户端事件处理程序的调用都是阻塞的。
当在一个独立的exe文件中托管同一个对象时,在调试或暂停一个客户端时不会发生阻塞。
我的问题是为什么我们在IIS下托管的对象和独立的exe之间看到了不同的行为?在IIS中是否有一个设置可以阻止一个客户端阻止其他客户端与单例进行通信。
该项目最初是一个2.0项目,目前它是针对3.5框架构建的,尽管我们没有使用任何3.5运行时。
客户端的远程处理配置如下
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="0" clientConnectionLimit="120" useDefaultCredentials="true" timeout="2000">
<clientProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
在IIS上,服务器配置如下
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http">
<clientProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
<service>
<wellknown mode="Singleton" displayName="NotificationManager" type="Notification.NotificationManager, Notification" objectUri="NotificationManager.rem"/>
</service>
</application>
</system.runtime.remoting>
</configuration>
独立服务器的配置如下:
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="8080" clientConnectionLimit="120" useDefaultCredentials="true" timeout="20000">
<clientProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
<service>
<wellknown mode="Singleton" displayName="NotificationManager" type="Notification.NotificationManager, Notification" objectUri="NotificationManager.rem"/>
</service>
</application>
</system.runtime.remoting>
答案 0 :(得分:0)
通过将超时值添加到通道
来修复IIS的完全阻止 <channel ref="http" timeout="20000">
我仍然感到惊讶的是,一个阻止客户端可能导致与其他计算机的连接开始失败。