2012-03-06 2 views
3

У меня есть служба WCF с режимом контекста экземпляра, установленным в PerCall, и с использованием wsHttpBinding. У плохо запрограммированного клиента есть возможность потреблять сеансы, не выпуская их должным образом (т. Е. Клиент не вызывает Close() на прокси-сервере клиента). Посмотрев на счетчик производительности «Percent of Max Concurrent Sessions», я вижу, что каждое соединение использует сеанс и не выпускает его. При нормальных, корректных обстоятельствах сеанс используется только несколько минут, пока результаты вызова возвращаются.WCF: тайм-аут сеанса связи за вызов

Я пытаюсь найти способ, чтобы эти плохие сеансы были тайм-аутом и ушел, но не увенчался успехом. Поскольку это не надежный сеанс, настройки RecieveTimeout и InactivityTimeout не оказывают никакого влияния. Вот часть моей текущей конфигурации, которая имеет ряд тайм-ауты, установленных в нем, но не похоже на работу:

 <behaviors> 
     <serviceBehaviors> 
      <behavior name="UpdaterBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceCredentials> 
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/> 
        <serviceCertificate findValue="xxxxxx" x509FindType="FindBySubjectName"/> 
       </serviceCredentials> 
       <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider"/> 
       <serviceThrottling maxConcurrentCalls="10" maxConcurrentSessions="10" maxConcurrentInstances="10" />      
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="UpdaterBinding" messageEncoding="Mtom" maxReceivedMessageSize="100000000" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:01:00" sendTimeout="00:01:00"> 
       <reliableSession ordered="true" inactivityTimeout="00:01:00" 
        enabled="false" /> 
       <readerQuotas maxArrayLength="100000000"/> 
       <security> 
        <message clientCredentialType="UserName"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 

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

Любые предложения?

ответ

1

Хорошо, я могу быть полностью вне базы здесь, но на основе того, что я понял из вашего вопроса, вот одно из возможных решений:

Видимо, вы можете получить список активных сеансов, но вы не можете завершить сеанс со стороны обслуживания:

http://social.msdn.microsoft.com/Forums/en/wcf/thread/a6a72bd7-bd06-43e3-8abb-d6c10432a07b

Одна вещь, которую я могу думать, если вы размещаете службы WCF в IIS, можно создать службу Windows, которая работает на сервере и глядя на активных сессий , Может быть, вы можете понять, когда сборка сеанса неуправляема для сервера и заставить его перезапустить пул приложений IIS?

Restarting (Recycling) an Application Pool

+0

Мне нужно будет изучить это дальше, но внешний запуск службы не является вариантом. Служба в настоящее время размещается в небольшом exe (не IIS). –

+0

Я не знаю, если это не вариант, потому что вы не хотите заканчивать все сеансы, но вы можете перезапустить любую службу, запущенную в окнах. http://www.csharp-examples.net/restart-windows-service/ – evasilchenko

+0

Извините, чтобы уточнить: снять весь сервис для обработки углового футляра, подобного этому, я не хочу этого делать. Стоимость регулярного прерывания обслуживания намного выше, чем вероятность того, что это когда-нибудь станет проблемой. –

1

Один из вариантов осиротевших сессий настроить WsHttpBinding не использовать какие-либо функции, которые зависят от сессий (таких как надежный обмен сообщениями, которые, как служба настроена сейчас).

Если у вас есть необходимость в бизнесе, требующая надежной передачи сообщений, перейдите в netMsmqBinding, чтобы получить гарантированную доставку сообщений, но ценой проектирования вокруг шаблона одностороннего обмена сообщениями. DeviantSeev правильно, что вы не можете контролировать завершение сеансов из службы, но рекомендуемое им решение довольно радикально. Это не реально, если у вас есть среда с большим объемом, например, сайт электронной коммерции из-за простоев, вызванных повторным использованием пула приложений.

+0

Я не думаю, что он настроен для надежного обмена сообщениями (обратите внимание на enabled = "false"). Если мне нужно сделать что-то еще, чтобы отключить надежный обмен сообщениями, я не знаю об этом. –

+0

Извините, что отсутствует 'enabled =" false "', я сосредоточился на части 'ordered =" true ".В качестве теста попробуйте отключить безопасность, как показано на этом [сообщение в форуме] (http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/271b1816-173c-4c76-a4c4-fd9fda4b5e91), а также удалите элемент safeSession из конфигурации. Посмотрите, помогает ли эта конфигурация в решении проблемы с сиротами. Если это произойдет, перезапустите систему безопасности и проверьте, не возникла ли проблема. Если причиной является безопасность, тогда вам нужно будет решить, действительно ли это отключение, это решение или нет для вашей ситуации. –

+0

Если я получу свободное время, я могу попробовать это, чтобы посмотреть, поможет ли это. Даже если это произойдет, к сожалению, отключить безопасность для этого на самом деле не вариант. –