WCF Hizmeti, zaman aşımı nasıl artırılır?


94

Aptalca bir soru gibi görünebilir, ancak WCF'deki her şey asmx'ten çok daha karmaşık görünüyor, bir svc hizmetinin zaman aşımını nasıl artırabilirim?

Şimdiye kadar sahip olduğum şeyler:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

Ve sonra uç noktam şu şekilde eşleştirilir:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

Aldığım tam hata:

00: 00: 59.9990000'den sonra yanıt beklerken istek kanalı zaman aşımına uğradı. İstek çağrısına aktarılan zaman aşımı değerini artırın veya Bağlamadaki SendTimeout değerini artırın. Bu işleme ayrılan zaman, daha uzun bir zaman aşımının bir kısmı olabilir.

WCF Test İstemcisinde, hizmetimin çalışma zamanı yapılandırmasını içeren bir yapılandırma simgesi vardır:

Gördüğünüz gibi onun için belirlediğim değerler aynı değil mi? Neyi yanlış yapıyorum?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

Yanıtlar:


179

Bağlama konfigürasyonunuzda ince ayar yapabileceğiniz dört zaman aşımı değeri vardır:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

En önemlisi, sendTimeoutmüşterinin WCF hizmetinizden bir yanıt için ne kadar bekleyeceğini belirten bilgidir. hours:minutes:secondsAyarlarınızda belirtebilirsiniz - örneğimde zaman aşımını 25 dakikaya ayarladım.

openTimeoutEğer WCF servisine bağlantı açtığınızda beklemek istekli süredir adından da anlaşılacağı gibi. Benzer şekilde, closeTimeoutbir istisna atılmadan önce bekleyeceğiniz bağlantıyı kapattığınız (istemci proxy'sini attığınız) süredir.

receiveTimeoutOlduğu için bir ayna gibi biraz sendTimeout- gönderme zaman aşımı sunucudan yanıt bekleyeceğim zamanın miktarı ise, receiveTimeoutzaman miktarıdır aldığınız ve yanıtı işlemek için size müşteri vereceğiz sunucu.

"Normal" mesajları ileri geri göndermeniz durumunda, her ikisi de oldukça kısa olabilir - özellikle de receiveTimeout, bir SOAP mesajı almak, şifresini çözmek, kontrol etmek ve seriyi kaldırmak neredeyse hiç zaman almayacaktır. Hikaye akışla farklıdır - bu durumda, sunucudan geri aldığınız akışın "indirilmesini" gerçekten tamamlamak için istemcide daha fazla zamana ihtiyacınız olabilir.

Ayrıca openTimeout, ReceTimeout ve closeTimeout var. Bağlayıcıya ilişkin MSDN belgeleri, bunların ne işe yaradığı hakkında size daha fazla bilgi verir.

WCF'nin tüm inceliklerini ciddi bir şekilde kavramak için, Michele Leroux Bustamante'nin " Learning WCF " kitabını satın almanızı şiddetle tavsiye ederim :

WCF'yi öğrenme http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

ve ayrıca onun 15 bölümlük " WCF Top to Bottom " ekran video kaydı serisini izleyerek biraz zaman geçiriyorsunuz - şiddetle tavsiye edilir!

Daha ileri düzey konular için Juwal Lowy'nin Programlama WCF Hizmetleri kitabına göz atmanızı tavsiye ederim .

WCF'yi programlama http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg


Ben <System.ServiceModel> web.config bağlanarak bölümler eklemek için denedim ama onun artık bir hata atma .... ben kaçırmış diğer ek adımlar ...
JL.

Ayrıca hizmetimdeki uç noktayı <endpoint address = "" binding = "IncreasedTimeout" olarak değiştirdim - bu yapılacak yanlış bir şey mi?
JL.

Sanırım anladım - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout"
JL.

tam olarak - bağlama, kullandığınız protokol türüdür - basicHttp, wsHttp, netTcp. Bağlama yapılandırması , zaman aşımlarını vb. Değiştirmek için yapılandırmada oluşturduğunuz bu yapılandırmadır
marc_s

Bunu yaptıktan sonra bile komik, yine de zaman aşımı hatası alıyorum, Marc lütfen mümkün olduğunca fazla bilgi verebilir misin?
JL.

27

En iyi yol, kodunuzda istediğiniz herhangi bir ayarı değiştirmektir.

Aşağıdaki örneğe bakın:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

bu yapılandırmayı güncellemek yerine daha iyi bir çözüm, böylece farklı aramalar ve hizmetler için farklı bir değer yapılandırabilirim, çok teşekkürler
Salim

26

Zaman aşımı yapılandırmasının istemci düzeyinde ayarlanması gerekir, bu nedenle web.config'de ayarladığım yapılandırmanın hiçbir etkisi olmadı, WCF test aracının kendi yapılandırması var ve zaman aşımını ayarlamanız gereken yer burası.


1
iyi, evet - tipik olarak hem istemcide hem de sunucuda ayarlanması gerekir, hatta - örneğin oturumlarda ve benzeri şeylerde "inactivityTimeout" durumunda.
marc_s

8
JL: Tam olarak ne yaptığınızı gösterebilir misiniz? aynı sorunu yaşıyorum
Nick Kahn

'WCF Test İstemcisi'ni kullanıyorsanız, hizmet ağacında' Yapılandırma Dosyası'na sağ tıklayın, ardından 'SvcConfigEditor ile Düzenle'ye tıklayın ve bağlantılarda zaman aşımını değiştirin.
Radderz

4

Yakın zamanda aynı hatayı aldım ancak her wcf istemcisi çağrısını kapatmayı sağlayarak düzeltmeyi başardı. Örneğin.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

veya

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

10
'Kullanarak' yaklaşımını kullanmayın: omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall

Omaralzabir.com/do-not-use-using-in-wcf-client'in yorumlarında, usinghatalı bir kanal nesnesini elden çıkarmadan nasıl kullanılacağına dair örnekler vardır . İşte usingbloklarla daha uyumlu bir yaklaşıma sahip başka bir blogcu : erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Greg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.