Dịch vụ WCF, làm thế nào để tăng thời gian chờ?


93

Có thể là một câu hỏi ngớ ngẩn, nhưng mọi thứ trong WCF có vẻ phức tạp hơn nhiều so với asmx, làm cách nào để tăng thời gian chờ của dịch vụ svc?

Đây là những gì tôi có cho đến nay:

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

Và sau đó điểm cuối của tôi được ánh xạ như thế này:

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

Lỗi chính xác mà tôi đang gặp phải:

Kênh yêu cầu đã hết thời gian chờ trả lời sau 00: 00: 59.9990000. Tăng giá trị thời gian chờ được chuyển cho cuộc gọi Yêu cầu hoặc tăng giá trị Thời gian chờ gửi trên Ràng buộc. Thời gian được phân bổ cho hoạt động này có thể là một phần của thời gian chờ lâu hơn.

Trong Máy khách kiểm tra WCF, có một biểu tượng cấu hình chứa cấu hình thời gian chạy của dịch vụ của tôi:

Như bạn có thể thấy nó không giống với các giá trị mà tôi đã đặt cho nó? Tôi đang làm gì sai?

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

Câu trả lời:


179

Trong cấu hình ràng buộc của bạn, có bốn giá trị thời gian chờ mà bạn có thể điều chỉnh:

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

Điều quan trọng nhất là sendTimeout, cho biết khách hàng sẽ đợi phản hồi từ dịch vụ WCF của bạn trong bao lâu. Bạn có thể chỉ định hours:minutes:secondstrong cài đặt của mình - trong mẫu của tôi, tôi đặt thời gian chờ là 25 phút.

Các openTimeoutnhư tên của nó là số lượng thời gian bạn sẵn sàng để chờ đợi khi bạn mở kết nối đến dịch vụ WCF của bạn. Tương tự, closeTimeoutlà khoảng thời gian khi bạn đóng kết nối (hủy bỏ proxy máy khách) mà bạn sẽ đợi trước khi một ngoại lệ được đưa ra.

Các receiveTimeoutlà một chút như một tấm gương cho sendTimeout- trong khi thời gian chờ gửi là số lượng thời gian bạn sẽ chờ câu trả lời từ máy chủ, receiveTimeoutlà số lượng thời gian bạn sẽ cung cấp cho bạn khách hàng để tiếp nhận và xử lý phản hồi từ người phục vụ.

Trong trường hợp bạn gửi đi gửi lại các tin nhắn "bình thường", cả hai đều có thể khá ngắn - đặc biệt là receiveTimeoutvì nhận được tin nhắn SOAP, việc giải mã, kiểm tra và giải mã hóa nó sẽ gần như không mất thời gian. Câu chuyện khác với phát trực tuyến - trong trường hợp đó, bạn có thể cần thêm thời gian trên máy khách để thực sự hoàn tất quá trình "tải xuống" luồng mà bạn lấy lại từ máy chủ.

Ngoài ra còn có openTimeout, acceptTimeout và closeTimeout. Tài liệu MSDN về ràng buộc cung cấp cho bạn thêm thông tin về những tài liệu này để làm gì.

Để hiểu rõ tất cả những điều phức tạp của WCF, tôi thực sự khuyên bạn nên mua cuốn sách " Học WCF " của Michele Leroux Bustamante:

Học WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

và bạn cũng dành thời gian xem loạt video truyền hình 15 phần " WCF Top to Bottom " của cô ấy - rất nên làm!

Đối với các chủ đề nâng cao hơn, tôi khuyên bạn nên xem cuốn sách Dịch vụ WCF lập trình của Juwal Lowy .

Lập trình WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg


Tôi đã cố gắng thêm các phần ràng buộc vào <system.serviceModel> trong web.config, nhưng hiện nó đang xuất hiện lỗi .... bất kỳ bước bổ sung nào mà tôi đã bỏ lỡ ...
JL.

Tôi cũng đã thay đổi điểm cuối trong dịch vụ của mình thành <endpoint address = "" bind = "IncreasedTimeout" - đây có phải là điều sai trái phải làm?
JL.

Tôi nghĩ rằng tôi hiểu nó - ràng buộc = "basicHttpBinding" bindConfiguration = "Tăng thời gian chờ"
JL.

chính xác - ràng buộc là loại giao thức bạn sử dụng - basicHttp, wsHttp, netTcp. Các ràng buộc cấu hình được cấu hình này bạn tạo trong cấu hình để thay đổi timeout, vv
marc_s

Buồn cười là ngay cả sau khi làm điều này, vẫn bị lỗi timeout, Marc bạn có thể vui lòng cho biết càng nhiều thông tin càng tốt được không?
JL.

27

Cách tốt nhất là thay đổi bất kỳ cài đặt nào bạn muốn trong mã của mình.

Kiểm tra ví dụ dưới đây:

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

đây là một giải pháp tốt hơn thay vì cập nhật cấu hình để tôi có thể định cấu hình một giá trị khác cho các cuộc gọi và dịch vụ khác nhau, cảm ơn rất nhiều
Salim

26

Cấu hình thời gian chờ cần được đặt ở cấp máy khách, vì vậy cấu hình tôi đang đặt trong web.config không có tác dụng, công cụ kiểm tra WCF có cấu hình riêng và ở đó bạn cần đặt thời gian chờ.


1
tốt, vâng - thông thường, nó phải được đặt cả trên máy khách và máy chủ, ngay cả - ví dụ như trong trường hợp "inactivityTimeout" trên các phiên và những thứ tương tự.
marc_s

8
JL: bạn có thể chỉ ra những gì bạn đã làm được không? tôi đang gặp vấn đề tương tự
Nick Kahn

Nếu bạn sử dụng 'Ứng dụng khách kiểm tra WCF', hãy nhấp chuột phải vào 'Tệp cấu hình' trong cây dịch vụ, sau đó nhấp vào 'Chỉnh sửa với SvcConfigEditor' và thay đổi thời gian chờ trong các ràng buộc.
Radderz

4

Gần đây gặp lỗi tương tự nhưng đã có thể khắc phục bằng cách đảm bảo đóng mọi cuộc gọi khách hàng wcf. ví dụ.

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

hoặc là

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

10
Không sử dụng 'sử dụng' cách tiếp cận: omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall

Trong các nhận xét của omaralzabir.com/do-not-use-using-in-wcf-client , có các ví dụ về cách vẫn sử dụng usingtrong khi không loại bỏ đối tượng kênh bị lỗi. Đây là một blogger khác có cách tiếp cận tương thích hơn với usingcác khối: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Greg
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.