2013-04-18 13 views
8

Ich rufe einen .net Webservice von meiner .net Winforms App, beide in Framework 4.0. Während der Ausführung des Programms, wenn der Webservice das erste Mal eine Methode aufgerufen hat, dauert der Aufruf ~ 10-12 Sekunden. Nachfolgende Anrufe dauern ~ 1-2 Sekunden. Nachfolgende Aufrufe, auch wenn die Web-Referenzinstanz neu erstellt wird, sind immer noch ~ 1-2 Sekunden. Wenn die Winforms-App neu gestartet wird, tritt die erste Anrufverzögerung erneut auf, nachfolgende Anrufe reagieren jedoch.Der erste Anruf bei einem .net Webservice ist langsam

Die Instanz der Webreferenz wird vor dem Aufruf erstellt und ist nicht Teil der Verzögerung.

XmlSerializers für die Winforms App werden generiert (und verwendet, soweit ich weiß, aber ich bin mir nicht sicher, wie dies zu überprüfen).

Die Verzögerung tritt nicht aufgrund einer Erst-Compilierung auf der Webservice-Seite auf. Dies ist ein Webservice für die Produktion, der den ganzen Tag verwendet wird und dessen Apppool im Speicher verbleibt. Soweit ich sehen kann, tritt die Verzögerung entweder auf der Clientseite oder zwischen dem Client und dem Server für diesen ersten Anruf auf, jedoch nicht bei nachfolgenden Anrufen.

Nicht sicher, was als nächstes zu überprüfen ist. Irgendwelche Ideen?

+1

Beachten Sie, dass der erste Anruf langsamer sein wird, aber es sollte nicht so langsam sein. – tier1

+1

Ich vermute, die Antwort liegt wahrscheinlich irgendwo in dieser Frage/Antwort-Kombination: http://stackoverflow.com/questions/6988981/webclient-isvery-slow Insbesondere betrachte ich Proxy-Probleme. – spender

+1

Haben Sie "Einstellungen automatisch erkennen" für Ihren Proxy in Internetoptionen auf der fehlerhaften Maschine? – spender

Antwort

9

Wie Spender angegeben hatte, hatte das Problem mit der Proxy-Erkennung zu tun. Das Ausschalten im Internet Explorer löste das Problem, war aber in meiner Situation nicht durchführbar.

Stattdessen gibt es eine Problemumgehung, um die Verwendung des Standardproxys und damit die automatische Erkennung zu umgehen.

diese Einträge in die app.config Hinzufügen können bestimmte URLs den Proxy umgehen:

<configuration> 
    <system.net> 
     <defaultProxy> 
      <bypasslist> 
       <add address="server/domain name" /> 
      </bypasslist> 
     </defaultProxy> 
    </system.net> 
</configuration> 

Weitere Informationen finden Sie hier: <defaultProxy Element> on MSDN

+0

Sie haben eine Winforms-Client-App, die auf dem Desktop ausgeführt wird, und das Ändern von Internet Explorer-Optionen hilft dabei? Nur Kuriositäten, lass es mich wissen! –

+0

@MareInfinitus: Es ist nicht wirklich eine Internet Explorer-Option per se, es ist eine Option der wininet-API, die auch Internet Explorer verwendet und eine GUI zur Konfiguration bietet. –

+0

Arbeitete für mich großartig –

0

Ich habe dieses Problem viele Male erlitten - Mann ich hasse es !!! lol Während ich es nie endgültig gelöst habe, könntest du ein paar Dinge ausprobieren. Rufen Sie zuerst während des Startvorgangs den Web-Service an und lassen Sie sich zuerst den "Schmerz" aus dem Weg räumen! Zweitens, versuchen Sie es mit dem IIS-Anwendungspool des Web-Service - machen Sie es so, dass es sich niemals selbst recycelt oder es zumindest zu einer un-göttlichen Stunde des Morgens oder vielleicht pro 10000 Anfragen tut.

Ich weiß, das ist wahrscheinlich keine so gute Antwort, aber hoffe, es hilft ein wenig!


EDIT:

Teil des Problems ist, dass der Web-Service ist nicht 'immer' - es geht zu schlafen, recycles usw., bis sie benötigt. Es lohnt sich, darüber nachzudenken, Web-Dienste am Leben zu erhalten, 5 9s up-Zeit usw.!

+0

Wird nicht helfen. OP hat diese Fragen in der Frage angekreuzt. – spender

+0

Korrigieren. Apppool ist hier nicht verwandt. aber danke für den Vorschlag –

+0

Dieser Webservice, während der Zeit meines Tests, ist tatsächlich 'immer' oben. Es wird von Kunden 2-3 mal pro Sekunde von 7 bis 19 Uhr oder so aufgerufen. Ich verstehe, was Sie in Bezug auf App-Pool-Recycling und dergleichen sagen, aber das ist hier nicht der Fall. –

-1

Ich habe diese Einstellungen auf meinem hinzugefügt Basichttpbinding, Deaktivieren der automatischen Proxyerkennung und Erzielen einer großen Beschleunigung bei der ersten Ausführungszeit. Dies funktioniert natürlich gut, wenn Sie sich in einer Intranetumgebung befinden oder Sie wissen, dass Sie überhaupt keinen Proxy benötigen.

bypassProxyOnLocal = "false"

useDefaultWebProxy = "false"

Hoffnung, das hilft.

+0

-1: das OP verwendet ASMX (Web-Referenzen) –

2

versuchen, den Proxy auf einen leeren WebProxy Einstellung, das heißt:

request.Proxy = new WebProxy(); 

oder Sie können die Proxy-Einstellungen in der .config-Datei für Ihre Anwendung überschreiben die Defaultproxy-Schlüssel in der system.net Abschnitt verwenden. Die folgende deaktiviert die automatische Proxy-Erkennung:

<configuration > 
    <system.net> 
    <defaultProxy> 
     <proxy bypassonlocal="true" usesystemdefault="false" /> 
    </defaultProxy> 
</system.net> 
</configuration> 

http://weblog.west-wind.com/posts/2005/Dec/14/Slow-Http-client-calls-from-ASPNET-20-Make-sure-you-check-your-Proxy-Settings

Verwandte Themen