Tăng giá trị thời gian chờ trong dịch vụ WCF


133

Làm cách nào để tăng thời gian chờ mặc định lên hơn 1 phút trên dịch vụ WCF?


Điều không rõ ràng, nhưng tôi nghĩ rằng bạn đang hỏi ngầm, là liệu có thể cấu hình ở phía máy chủ để hết thời gian cho bất kỳ cuộc gọi nào mất hơn một phút để xử lý hay không. Điều này là không thể
gravidThoughts

Câu trả lời:


196

Bạn đang đề cập đến phía máy chủ hoặc phía khách hàng?

Đối với một khách hàng, bạn sẽ muốn điều chỉnh thuộc tính sendTimeout của một thành phần ràng buộc. Đối với một dịch vụ, bạn sẽ muốn điều chỉnh thuộc tính receiveTimeout của một phần tử ràng buộc.

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

Tất nhiên, bạn phải ánh xạ điểm cuối mong muốn của mình vào ràng buộc cụ thể đó.


Làm cách nào để ánh xạ liên kết, sử dụng 'ràng buộc' bên trong thẻ điểm cuối?
Blankman

Điều này chỉ đơn giản là sai Phía receiveTimeoutphía máy chủ chi phối việc xác định tính nhàn rỗi cho các ràng buộc dựa trên phiên. Ví dụ: máy chủ sẽ không sử dụng cài đặt này cho các ràng buộc basicHTTP. Bạn phải cuộn thời gian xử lý phía máy chủ của riêng mình cho WCF
gravidThoughts

45

Trong menu Công cụ trong Visual Studio 2008 (hoặc 2005 nếu bạn đã cài đặt đúng công cụ WCF), có một tùy chọn gọi là 'Trình chỉnh sửa cấu hình dịch vụ WCF'.

Từ đó bạn có thể thay đổi các tùy chọn ràng buộc cho cả máy khách và dịch vụ, một trong những tùy chọn này sẽ dành cho thời gian chờ.


Công cụ này là một cách tuyệt vời để tránh các lỗi như gói các phần tử sai cách, chính tả, v.v ... Gọi tốt!
markaaronky

xem thêm ở đây để biết công cụ khác để mở các tệp nhật ký: stackoverflow.com/a/34283667/187650
juFo


8

Bạn có thể chọn hai cách:

1) Theo mã trong máy khách

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) Bởi WebConfig trong một máy chủ 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>

Để biết thêm chi tiết xem các tài liệu chính thức

Định cấu hình giá trị thời gian chờ trên một liên kết

Lớp WSHttpBinding


0

Ngoài thời gian chờ ràng buộc (tính bằng Timespans), Bạn cũng có thể cần điều này. Đây là trong vài giây.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.