Meningkatkan nilai batas waktu dalam layanan WCF


133

Bagaimana cara meningkatkan batas waktu default menjadi lebih dari 1 menit pada layanan WCF?


Yang tidak jelas, tetapi saya pikir Anda bertanya secara implisit, adalah apakah mungkin untuk mengkonfigurasi di sisi server untuk menghentikan panggilan yang membutuhkan waktu lebih dari satu menit untuk diproses. Ini tidak mungkin
gravidThoughts

Jawaban:


196

Apakah Anda mengacu pada sisi server atau sisi klien?

Untuk klien, Anda ingin menyesuaikan atribut sendTimeout dari elemen yang mengikat. Untuk layanan, Anda ingin menyesuaikan atribut acceptTimeout dari elemen yang mengikat.

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

Tentu saja, Anda harus memetakan titik akhir yang Anda inginkan ke pengikatan tertentu.


Bagaimana cara memetakan pengikatan, menggunakan 'bindingname' di dalam tag titik akhir?
Blankman

Ini benar-benar salah. Di receiveTimeoutsisi server mengatur penentuan kemalasan untuk binding berbasis sesi. Misalnya, server tidak akan menggunakan pengaturan ini untuk binding basicHTTP. Anda harus memutar batas waktu pemrosesan sisi server Anda sendiri untuk WCF
gravidThoughts

45

Di bawah menu Alat di Visual Studio 2008 (atau 2005 jika Anda memiliki hal-hal WCF yang tepat diinstal) ada pilihan yang disebut 'WCF Service Configuration Editor'.

Dari sana Anda dapat mengubah opsi yang mengikat untuk klien dan layanan, salah satu dari opsi ini adalah untuk time-out.


Alat ini adalah cara terbaik untuk menghindari kesalahan seperti membungkus elemen dengan cara yang salah, mengeja, dll. Panggilan bagus!
markaaronky

lihat juga di sini untuk alat lain untuk membuka file log: stackoverflow.com/a/34283667/187650
juFo


8

Anda dapat memilih dua cara:

1) Dengan kode di klien

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) Dengan WebConfig di server web

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

Untuk lebih jelasnya lihat dokumentasi resmi

Mengkonfigurasi Nilai Batas Waktu pada Binding

Kelas WSHttpBinding


0

Selain batas waktu yang mengikat (yang ada di Timespans), Anda mungkin juga membutuhkan ini. Ini dalam hitungan detik.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.