Ошибка WCF "Слишком много активных переговоров по безопасности" в производстве - PullRequest
6 голосов
/ 08 июня 2011

У нас есть служба WCF, на которую звонят более 100 клиентских сайтов.Сегодня мы начали получать

Exception: Server 'http://[url]/services/[service].svc/ws' sent back a     
fault indicating it is too busy to process the request. Please retry later. Please see the 
inner exception for fault details.
System.ServiceModel.FaultException: There are too many active security negotiations or 
secure conversations at the service. Please retry later.

Единственная информация, которую я смог найти, - это то, что мне нужно увеличить maxPendingSessions.Но для этого потребуется изменить конечную точку на CustomBinding, что будет сложно, потому что мне придется распространять это на все мои клиентские сайты.

Есть ли какой-нибудь способ, которым я могу просто "сбросить" количество переговоров по безопасности и тому подобное?Это дало бы нам время на изменение клиентской программы для использования пользовательской привязки, потому что в настоящее время наши сайты не могут общаться с нашим сервером.
Я попытался внести небольшое изменение в файл конфигурации и сохранить его, что должно былоперезапустил службу, но мы все еще получаем ошибки.

Или есть какой-то другой способ, которым я мог бы обработать это?

Редактировать Вот мой конфиг:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,     Microsoft.Practices.EnterpriseLibrary.Data"/>
  </configSections>
  <connectionStrings>
  </connectionStrings>
    <system.web>
      <compilation debug="true" targetFramework="4.0"/>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Error" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
          </source>
    </sources>
    <sharedListeners>
      <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\logs\log.txt" />
    </sharedListeners>
  </system.diagnostics>

  <system.serviceModel>
<diagnostics performanceCounters="All" />
        <services>
       <service name="WCFServiceLibrary.WCFService">
     <endpoint address="ws" binding="wsHttpBinding"     bindingConfiguration="WSHttpBinding_IWCFService"
      name="WSHttpEndpoint_IWCFService" contract="WCFServiceLibrary.IWCFService" />
     <endpoint address="basic" binding="basicHttpBinding"
              name="BasicHttpEndpoint_IWCFService"             contract="WCFServiceLibrary.IWCFService" />
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
   </service>
  </services>
    <bindings>
          <wsHttpBinding>
            <binding name="WSHttpBinding_IWCFService" 
            maxBufferPoolSize="524288" maxReceivedMessageSize="1048576">
        <readerQuotas maxDepth="32" maxStringContentLength="65536"     maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Message">
            <message clientCredentialType="Certificate"     negotiateServiceCredential="true"
                algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
        <behaviors>
            <serviceBehaviors>
        <behavior>
          <serviceCredentials>
            <serviceCertificate findValue="CN=[url]" storeLocation="LocalMachine"     storeName="TrustedPeople" />
            <clientCertificate>
              <authentication revocationMode="NoCheck"     certificateValidationMode="PeerTrust" />
                </clientCertificate>
          </serviceCredentials>
          <serviceThrottling maxConcurrentCalls ="1001" maxConcurrentSessions="1001"     maxConcurrentInstances="1000" />
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug     includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
            <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    </system.serviceModel>
</configuration>

РЕДАКТИРОВАТЬ
Мы попробовали iisreset и даже перезапустили сервер, и он по-прежнему выдает ту же ошибку.

Ответы [ 2 ]

3 голосов
/ 21 августа 2012

http://social.msdn.microsoft.com/Forums/en-GB/wcf/thread/a8f82f1d-e824-474e-84ef-b5e9ba7eca18

Проблема заключается в создании клиента, но без его использования (без вызова какого-либо метода).

http://litemedia.info/there-are-too-many-active-security-negotiations-or-secure-conversations-at-the-service

Я потратил 4 дня на изучение этогов .NET 4.0 понять, что это НЕ исправлено.

Воспроизвести легко:

ChannelFactory<IFoo> foo = new ChannelFactory<IFoo>("binding");
foo.Open();
foo.Close();

После 128 вызовов вы получите ошибку.

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

0 голосов
/ 09 июня 2011

Поскольку кажется, что вы не используете фабрику пользовательских сервисов, вы не создаете одноэлементную службу, размещенную в IIS. Проблема может быть связана с настройкой службы для многопоточного запуска. Если ваша служба не содержит код, который зависит / управляет несколькими потоками, вы должны настроить экземпляр службы как однопоточный. Установите ConcurrencyMode = Single и удалите элемент serviceThrottling из конфигурации, чтобы использовать для них встроенные значения WCF по умолчанию. Если исключения исчезнут, то все готово. В противном случае вы будете знать, что это была не многопоточная конфигурация или настройки регулирования службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...