2010-05-04 49 views
6

Chúng tôi có dịch vụ WCF (BasicHttpBinding) sẽ luôn thất bại sau 30 giây. Cuộc gọi dưới 30 giây hoàn tất mà không có lỗi. Bất cứ điều gì trên 30 giây sẽ thất bại với ngoại lệ 502 Bad Gateway:Cuộc gọi dịch vụ WCF luôn thất bại sau 30 giây với (502) Cổng xấu

System.Net.WebException: The remote server returned an error: (502) Bad Gateway.

Nhưng cuộc gọi WCF vẫn tiếp tục chạy ngầm (và cuối cùng sẽ hoàn thành). Chúng tôi đã xác nhận rằng BasicHttpBinding - Binding - sendTimeout (trong web.config) lớn hơn 30 giây (thực sự được đặt là 5 phút). Chúng tôi đã xác nhận điều này cả trên máy khách và máy chủ.

Đây là ngăn xếp đầy đủ dấu vết:

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (502) Bad Gateway. ---> System.Net.WebException: The remote server returned an error: (502) Bad Gateway. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 

Bất kỳ ý tưởng nơi 30 giây "timeout" này xuất phát từ hoặc lý do tại sao một lỗi 502 Bad Gateway được trả lại?

GIẢI PHÁP: Chúng tôi đang sử dụng Mô-đun định tuyến yêu cầu ứng dụng IIS7 có cài đặt Proxy của riêng nó. Cài đặt Proxy có thời gian chờ mặc định là 30 giây. Việc tăng này lên 600 giây (10 phút) đã giải quyết được vấn đề của chúng tôi. Lỗi Bad Gateway không hoàn toàn chính xác nhưng WCF Trace Viewer (xem câu trả lời) đã giúp thấy rằng vấn đề không phải là bản thân dịch vụ mà là một vấn đề giữa khách hàng và dịch vụ wcf.

Trả lời

5

Bạn có thể muốn thử sửa đổi các giá trị cấu hình thời gian chờ khác:

closeTimeout, openTimeout, recieveTimeout.

Xem this MSDN post để biết thông tin vào các mục cấu hình, tóm tắt dưới đây:

Client side:

  • SendTimeout is used to initialize the OperationTimeout, which governs the whole interaction for sending a message (including receiving a reply message in a request-reply case). This timeout also applies when sending reply messages from a CallbackContract method.
  • OpenTimeout and CloseTimeout are used when opening and closing channels (when no explicit timeout value is passed).

Server side:

  • Send, Open, and Close Timeout same as on client (for Callbacks).
  • ReceiveTimeout is used by ServiceFramework layer to initialize the session-idle timeout.

thêm:

Chỉ khác điều tôi có thể đề nghị là sử dụng WCF Service vết Viewer để có được để dưới cùng của những gì gây ra vấn đề. Xem số SO Post nếu bạn yêu cầu chi tiết về cách sử dụng.

+0

Chúng tôi đã thử tăng closeTimeout, openTimeout và receiveTimeout lên 5 phút (trên máy khách và máy chủ) mà vẫn thấy sự cố. –

+0

Cảm ơn thông tin về WCF Service Trace Viewer. Tôi đã sử dụng nó để thu thập một dấu vết trên cả máy khách và máy chủ nhưng tất cả những gì tôi thấy từ máy chủ đó là hoàn thành đúng cách nhưng máy khách kết thúc bằng "Phản hồi HTTP đã nhận" với thông báo nội bộ là "Máy chủ từ xa đã trả về một phản ứng không mong muốn: (502) Bad Gateway. " Máy chủ hoàn tất sau 42 giây và máy khách sẽ gặp lỗi sau 31 giây.Nó luôn luôn là 31 giây cho khách hàng. –

+0

Đã tìm ra. Chúng tôi đang sử dụng Mô-đun định tuyến yêu cầu ứng dụng IIS7 có cài đặt Proxy, một trong số đó là thời gian chờ 30 giây. Sử dụng WCF Service Trace Viewer đã giúp tôi hiểu rằng các dịch vụ WCF không phải là vấn đề nhưng một cái gì đó ở giữa khách hàng và dịch vụ. –

0

Tôi đã tự mình gặp vấn đề này ngay hôm nay. Tải tệp lên webservice WCF từ ứng dụng SL4 tiếp tục tăng ngoại lệ ConnectionTimeout sau 30 giây.

tôi tìm ra nguyên nhân của vấn đề là việc sử dụng các phương pháp WebRequest.RegisterPrefix theo khuyến cáo của Microsoft để khắc phục xử lý ngoại lệ Fault trong Silverlight:

bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 

Xem http://msdn.microsoft.com/en-us/library/ee844556(v=vs.95).aspx

1

IIS -> Advanced Cài đặt -> Giới hạn kết nối

Tăng số đó (tính bằng giây) lên số tiền mong muốn.

Hy vọng điều này sẽ giúp bất kỳ nhân viên Google nào ở ngoài đó!

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