Meningkatkan nilai batas waktu dalam layanan WCF

133

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

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

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

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

daniele3004
sumber
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 -->
Derreck Dean
sumber