2010-05-04 14 views
6

Wir haben einen WCF-Dienst (BasicHttpBinding), der immer nach 30 Sekunden fehlschlägt. Anrufe unter 30 Sekunden werden ohne Fehler abgeschlossen. Alles, was mehr als 30 Sekunden mit einer 502 Bad Gateway Ausnahme fehlschlagen:WCF-Serviceaufrufe schlagen immer nach 30 Sekunden fehl mit (502) Bad Gateway

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

aber noch der WCF Anruf läuft im Hintergrund (und wird schließlich vollständig) laufen. Wir haben bestätigt, dass BasicHttpBinding - Binding - sendTimeout (in web.config) größer als 30 Sekunden ist (tatsächlich auf 5 Minuten festgelegt). Wir haben dies sowohl auf dem Client als auch auf dem Server bestätigt. Hier

ist die volle Stack-Trace:

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) 

Irgendwelche Ideen, wo diese 30 Sekunden "timeout" herkommt, warum ein 502 Bad Gateway Fehler zurückgegeben wird?

LÖSUNG: Wir verwenden das IIS7 Application Request Routing-Modul, das über eigene Proxy-Einstellungen verfügt. Die Proxy-Einstellungen haben eine Standard-Zeitüberschreitung von 30 Sekunden. Die Erhöhung auf 600 Sekunden (10 Minuten) löste unser Problem. Der Bad Gateway-Fehler ist nicht vollständig korrekt, aber WCF Trace Viewer (siehe Antwort) half zu sehen, dass das Problem nicht der Dienst selbst war, sondern ein Problem zwischen dem Client und dem WCF-Dienst.

Antwort

5

Sie sollten die anderen Timeout-config-Werte suchen versuchen ändern:

Close, Opentimeout, recieveTimeout.

this MSDN post Informationen zu den Konfigurations Artikel siehe Übersicht unten auswählen:

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.

ZUSÄTZLICH:

Die einzige andere Sache, die ich vorschlagen kann, ist die WCF-Service Trace Viewer zu verwenden, um den Grund zu gehen von Was verursacht das Problem? Sehen Sie diese SO Post, wenn Sie Details zur Verwendung benötigen.

+0

Wir haben versucht, closeTimeout, openTimeout und receiveTimeout auf 5 Minuten zu erhöhen (auf Client und Server) und sehen immer noch das Problem. –

+0

Danke für die Info zum WCF Service Trace Viewer. Ich habe es verwendet, um eine Ablaufverfolgung auf dem Client und Server zu sammeln, aber alles, was ich daraus sehe, ist, dass der Server ordnungsgemäß abgeschlossen wird, aber der Client endet mit einer "schlechten HTTP-Antwort erhalten" mit der internen Nachricht "Der Remote-Server zurückgegeben eine unerwartete Antwort: (502) Schlechtes Gateway. Der Server ist nach 42 Sekunden abgeschlossen und der Client erhält den Fehler nach 31 Sekunden.Es sind immer 31 Sekunden für den Client. –

+0

Ich habe es herausgefunden. Wir verwenden das IIS7 Application Request Routing-Modul, das über Proxy-Einstellungen verfügt, von denen eine 30-Sekunden-Zeitüberschreitung war. Die Verwendung von WCF Service Trace Viewer half mir zu verstehen, dass der WCF-Dienst nicht das Problem war, sondern etwas zwischen dem Client und dem Dienst. –

0

Ich habe dieses Problem heute selbst getroffen. Beim Hochladen einer Datei von einer SL4-App auf einen WCF-Webservice wurde nach 30 Sekunden immer noch eine ConnectionTimeout-Ausnahme ausgelöst.

fand ich die Ursache des Problems die Verwendung der WebRequest.RegisterPrefix Methode zu sein, wie von Microsoft empfohlen Fehlerausnahmebehandlung in Silverlight zu überwinden:

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

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

1

IIS -> Erweitert Einstellungen -> Verbindungslimits

Diese Zahl (in Sekunden) auf die gewünschte Anzahl erhöhen.

Hoffe, das hilft jedem Googler da draußen!

Verwandte Themen