2011-06-08 15 views
6

100'den fazla istemci sitesinin arama yaptığı bir WCF hizmetimiz var. Bugün bulabildiğimWCF Üretimde "Çok fazla aktif güvenlik anlaşması" hatası var

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. 

tek bilgi ı maxPendingSessions büyük yapmak gerekir olmasıdır başladım. Ancak bu, son noktayı bir CustomBinding olarak değiştirmeyi gerektirecektir; bu da zor olacaktır çünkü bunu tüm müşteri sitemlerime zorlamak zorunda kalacağım.

Güvenlik görüşmelerinin sayısını "sıfırlayabilmem" gibi bir yol var mı? Bu, istemci programını özel bağlamayı kullanacak şekilde değiştirmemiz için zaman verebilirdi, çünkü şu anda sitelerimiz sunucumuzla konuşamıyor.
Yapılandırma dosyasında küçük bir değişiklik yapmayı denedim ve bu, hizmeti yeniden başlatmalıydı, ancak yine de hata alıyoruz.

Veya bunu halledebileceğim başka bir yol var mı?

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

DÜZENLEME
Biz iisreset denedik ve hatta sunucuyu yeniden ve hala aynı hatayı atıyor:

Düzenleme İşte benim yapılandırma var.

+0

Bir tür oturum kısıtlaması olan bir tekli hizmetiniz var gibi görünüyor. Sorunuzdaki servis sözleşmesi kurulumu ve yapılandırması hakkında bilgi verirseniz yardımcı olur. –

+0

@Sixto Evet öyle. IIS'de barındırılıyor. Benim yapılandırmamı ekledim. – Marcus

+0

Uygulama havuzunu geri dönüştürmek, sıfırlama sorunuzu yanıtlayacaktır, ancak sorununuzu çözmeyecektir. Sertifikaları kullandığınızdan, uygulamasında uygulamanızdan başka etkenlere neden olabilirsiniz. CA kurulumunuz nasıl? –

cevap

3

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

sorun uygulamaları oluşturmak ancak (üzerinde herhangi bir yöntem arama değil) kullanarak değildir.

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

onu düzelttirmek DEĞİLDİR gerçekleştirmek için .NET 4.0 bu şekilde incelemekte 4 gün geçirdi.

Repro kolaydır: Eğer hata alıyorum

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

aramalar 128 sonra.

Neden sabit olmadığını bilmiyorum ama çözümü aramanız gerektiğinden emin olduğunuzda proxy oluşturmaktır. Artan maxPending noy, hazineyi hala vurabileceğiniz için gerçekten faydalı.

+0

"Aramanız gerektiğinden emin olduğunuzda proxy" nasıl oluşturulur? Aynı problemi yaşıyorum ve mesajınız umut verici ama aynı zamanda sinir bozucu. – Sam

0

Özel bir hizmet fabrikası kullanmadığınız görülüyorsa, IIS'de barındırılan bir tekli hizmet oluşturmuyorsunuz. Sorun, hizmetinizi çok iş parçacıklı çalıştırılacak şekilde ayarlamayla ilgili olabilir. Hizmetiniz, birden çok iş parçacığına bağlı/yöneten kod içermiyorsa, hizmet bilgisini tek bir iş parçacığı olarak yapılandırmalısınız. ConcurrencyMode = Single öğesini ayarlayın ve bunlar için yerleşik WCF varsayılanlarını kullanmak üzere serviceThrottling öğesini config'tan kaldırın. İstisnalar giderse, işin bitti. Aksi takdirde, çok iş parçacıklı yapılandırma veya hizmet kısıtlama ayarlarının olmadığını biliyorsunuzdur.

+0

ConcurrencyMode = Tek bir seferde tek bir çağrıyla beni sınırlamadı mı? Bu iyi ölçeklenmeyecek ve müşterilerimin başkalarının bitirmesini beklemek zorunda kalmasını istemiyorum. IIS ile – Marcus

+0

WCF ve sorunuza sahip olduğunuz yapılandırma WCF oturumu başına bir hizmet örneğini (ASP.NET oturumundan tamamen ** bağımsız **) döndürecektir. Bu [MSDN makalesi] (http://msdn.microsoft.com/en-us/library/ms733040.aspx) WCF oturumları hakkında ayrıntılı bir genel bakışa sahiptir. Arama başına veya oturum başına InstanceContextMode ayarları çok ölçeklenebilir. ConcurrencyMode denetimlerinin her hizmet örneğinin çok iş parçacıklı olmasına izin verilip verilmediğine bağlıdır. –

İlgili konular