Хостинг remoting singleton в IIS, клиенты могут заблокировать сервер - PullRequest
1 голос
/ 26 мая 2009

У нас есть удаленный одноэлементный объект, размещенный в IIS, который обслуживает несколько клиентов. Во время разработки мы заметили, что если один клиент остановлен в отладчике, все остальные подключенные клиенты перестанут получать сообщения с сервера. Сообщения доставляются через события обратного вызова, сервер будет создавать свои собственные потоки для отправки сообщений. Я могу создать такое же поведение, поместив Sleep в обработчик событий клиента. Трассировка, которую мы имеем на сервере, показывает, что вызовы всех клиентских обработчиков событий блокируются.

Когда один и тот же объект размещается в автономном exe-файле, блокировка не происходит, когда один клиент отлаживается или иным образом приостанавливается.

Мой вопрос: почему мы видим различное поведение между нашим объектом, размещенным под IIS, и отдельным exe-файлом? Есть ли в IIS параметр, который не позволяет одному клиенту блокировать другие клиенты, разговаривающие с синглтоном.

Первоначально проект был проектом 2.0, в настоящее время он строится на основе платформы 3.5, хотя мы не используем ни одну из сред выполнения 3.5.

Remoting для клиента настроены так

  <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>

1 Ответ

0 голосов
/ 26 мая 2009

Исправлена ​​полная блокировка IIS путем добавления значения тайм-аута в канал

  <channel ref="http" timeout="20000">

Я все еще удивлен, что один блокирующий клиент может вызвать сбой подключения к другим машинам.

...