WCF hizmetinde zaman aşımı değerini artırma


133

WCF hizmetinde varsayılan zaman aşımı süresini 1 dakikadan daha fazla nasıl artırabilirim?


Ne net değil, ama ben dolaylı olarak sorduğunuzu düşünüyorum, sunucu tarafında işlemek için bir dakikadan daha uzun süren herhangi bir zaman aşımı yapılandırmak mümkün olup olmadığını olduğunu. Bu mümkün değil
gravid

Yanıtlar:


196

Sunucu tarafına mı yoksa istemci tarafına mı atıfta bulunuyorsunuz?

İstemci için, bir bağlama öğesinin sendTimeout özniteliğini ayarlamak istersiniz . Bir hizmet için, bir bağlayıcı öğenin takeTimeout özniteliğini ayarlamak istersiniz.

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>

  <services>
    <service name="longTimeoutService"
      behaviorConfiguration="longTimeoutBehavior">
      <endpoint address="net.tcp://localhost/longtimeout/"
        binding="netTcpBinding" bindingConfiguration="longTimeoutBinding" />
    </service>
....

Tabii ki, istediğiniz bitiş noktasını bu belirli ciltleme ile eşlemelisiniz.


Bitiş noktası etiketinin içindeki 'bağlayıcı adı' kullanarak bağlayıcıyı nasıl eşlerim?
Blankman

Bu yanlıştırreceiveTimeout oturumu tabanlı bağlamaları için tembellik sunucu tarafının idare eder belirlenmiş olmasına dayanmaktadır. Örneğin, sunucu bu ayarı temelHTTP bağlamaları için kullanmayacaktır. WCF için kendi sunucu tarafı işlem zaman aşımlarını yuvarlamanız gerekiyor
gravidThoughts

45

Visual Studio 2008'deki (veya doğru WCF öğelerini yüklediyseniz 2005) Araçlar menüsü altında 'WCF Hizmet Yapılandırma Düzenleyicisi' adı verilen bir seçenek vardır.

Buradan hem istemci hem de hizmetler için bağlama seçeneklerini değiştirebilirsiniz, bu seçeneklerden biri zaman aşımları için olacaktır.


Araç, öğeleri yanlış şekilde sarma, yazım vb. Hatalardan kaçınmak için harika bir yoldur.
markaaronky

günlük dosyalarını açmak için diğer araç için de buraya bakın: stackoverflow.com/a/34283667/187650
juFo


8

İki yol seçebilirsiniz:

1) İstemcideki kod ile

public static void Main()
{
    Uri baseAddress = new Uri("http://localhost/MyServer/MyService");

    try
    {
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService));

        WSHttpBinding binding = new WSHttpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

        serviceHost.AddServiceEndpoint("ICalculator", binding, baseAddress);
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

    }
    catch (CommunicationException ex)
    {
        // Handle exception ...
    }
}

2) Web sunucusunda WebConfig tarafından

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Daha fazla ayrıntı için resmi belgelere bakın

Bir Bağlamada Zaman Aşımı Değerlerini Yapılandırma

Sınıf WSHttpBinding


0

Bağlama zaman aşımlarına ek olarak ( Timespans cinsinden ) buna da ihtiyacınız olabilir. Bu saniyeler içinde.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
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.