2012-06-26 39 views
22

Tôi có một ứng dụng nhỏ sử dụng WCF để giao tiếp với máy chủ web. Chương trình này được 200 khách hàng sử dụng và mỗi khách hàng gửi khoảng 5-20 yêu cầu/phút.Kênh yêu cầu hết thời gian chờ trong khi chờ trả lời

Nhìn vào các bản ghi lỗi tôi thường nhận được:

Kênh yêu cầu time out trong khi chờ đợi một câu trả lời sau khi 00: 00: 59,9989999

Các yêu cầu được thực hiện như sau:

ClientService Client = new ClientService(); 
Client.Open(); 
Client.updateOnline(userID); 
Client.Close(); 

Đây là app.config

<configuration> 
<configSections> 
</configSections> 
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
       allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="None"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="PATH TO SERVICE" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService" 
      contract="IClientService" name="WSHttpBinding_IClientService"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Trong số "nhiều cuộc gọi" mỗi ngày khoảng 200-800 không thành công. Và về n-1 là ok. Tôi rất bối rối về vấn đề này. Nhìn vào số liệu thống kê máy chủ, nó hầu như không tạo ra mồ hôi - mỗi yêu cầu mất < 2 giây để xử lý. Các dữ liệu nó gửi bao gồm "int" hoặc "dây rất nhỏ" - vì vậy, nó không phải do kích thước, nếu nó là - có phải là một thất bại phù hợp ..

Gợi ý?

+0

bạn đang lưu trữ dịch vụ này trong IIS hoặc là nó được tổ chức bởi một dịch vụ cửa sổ hoặc một số ứng dụng khác? –

+0

Bạn đã thử chơi với cài đặt hết thời gian chờ và báo giá trong tệp cấu hình chưa? – eulerfx

+0

Trên thực tế, tôi đề nghị bật truy tìm WCF (như được giải thích tại đây: http://msdn.microsoft.com/en-us/library/ms733025.aspx) và xem lại các thông báo được ghi lại khi các lỗi này xuất hiện. –

Trả lời

9

Dường như yêu cầu của bạn đang xếp hàng trên máy chủ trước khi được xử lý và sau đó bắt đầu thời gian ra. Bạn có thể thử vài điều vào đây để xem chính xác những gì đang diễn ra

1) Hãy thử throttling trong các dịch vụ WCF của bạn ví dụ: Cố gắng tăng phiên đồng thời của bạn. Hãy xem WCF Throttling

2) Thử sử dụng PerCall thay vì Sử dụng phiên tại đây để đảm bảo rằng không có phiên nào còn lại ở đó. Dưới đây là những gì bạn có thể làm trên giao diện của bạn để loại bỏ phiên

[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)] 

và hợp đồng của bạn lớp thực hiện những giao diện

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

VÀ .... Bạn nên enable truy tìm để xem chính xác whats going on.

+0

Tôi đã làm những gì bạn đề xuất .. và tôi để nó chạy trong khoảng 15 phút .. Chỉ có một khách hàng đang báo cáo vấn đề .. (Cùng một vấn đề thời gian chờ) .. Tôi sẽ để nó chạy một thời gian và xem liệu một khách hàng duy nhất của nó có báo cáo vấn đề ngay bây giờ hay không. (aka .. nó trễ) ... –

3

Kiểm tra bộ đếm hiệu suất này - ASP.NET Requests Queued.

Một ứng dụng web có thể lưu trữ nhiều trang web và dịch vụ. IIS chỉ xử lý 12 yêu cầu đồng thời trên mỗi lõi CPU theo mặc định.

Điều này có nghĩa là ngay cả khi dịch vụ của bạn nhanh nhưng các trang/dịch vụ khác chậm yêu cầu của bạn phải chờ trong hàng đợi trước khi chúng được thực thi.

ASP.NET Requests Queued phải bằng 0 hoặc gần bằng không.

Xem Performance Counters for ASP.NET on MSDN.

+0

Trong 2 phút - yêu cầu ASP.NET tối đa xếp hàng là 1 .. Yêu cầu ASP.NET v4 xếp hàng là 0 (ngồi đang chạy .NET 4) –

25

Hãy thử thêm các giá trị thời gian chờ cho cả hai dịch vụ và khách hàng:

<binding name="BasicHttpBinding_SomeName" closeTimeout="00:01:00" 
    openTimeout="00:01:00" receiveTimeout="00:10:00" 
    sendTimeout="00:10:00" maxBufferPoolSize="2147483647" 
    maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
+1

Nó hoạt động. Giải pháp đơn giản và dễ dàng. Tôi đã đặt điều này trên máy khách và dịch vụ. Cảm ơn rất nhiều. – FrenkyB

Các vấn đề liên quan