У меня есть служба 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 гораздо выше, но это просто скрывает проблему на некоторое время , и в конечном итоге плохой клиент будет использовать все сеансы. Я хочу, чтобы сервер освободил любой сеанс, который был вокруг уже более нескольких минут, так как нет никакой причины, чтобы что-то в этом сервисе должно длиться так долго.
Любые предложения?
Мне нужно будет изучить это дальше, но внешний запуск службы не является вариантом. Служба в настоящее время размещается в небольшом exe (не IIS). –
Я не знаю, если это не вариант, потому что вы не хотите заканчивать все сеансы, но вы можете перезапустить любую службу, запущенную в окнах. http://www.csharp-examples.net/restart-windows-service/ – evasilchenko
Извините, чтобы уточнить: снять весь сервис для обработки углового футляра, подобного этому, я не хочу этого делать. Стоимость регулярного прерывания обслуживания намного выше, чем вероятность того, что это когда-нибудь станет проблемой. –