2013-04-18 15 views
8

Dzwonię do usługi .net z mojej aplikacji .net, zarówno w wersji 4.0. Podczas wykonywania programu, po raz pierwszy usługa sieciowa ma wywoływaną metodę, wywołanie trwa ~ 10-12 sekund. Kolejne połączenia trwają ~ 1-2 sekundy. Kolejne wywołania, nawet po odtworzeniu instancji odwołującej się do sieci, trwają nadal ~ 1-2 sekundy. Po ponownym uruchomieniu aplikacji WinForm pierwsze opóźnienie połączenia występuje ponownie, ale kolejne wywołania są responsywne.Pierwsze wywołanie usługi sieci .net jest powolne.

Wystąpienie odwołania do strony internetowej jest tworzone przed wywołaniem połączenia i nie jest częścią opóźnienia.

XmlSerializers dla aplikacji winforms są generowane (i używane, o ile wiem, ale nie jestem pewien, jak to zweryfikować).

Opóźnienie nie występuje z powodu kompilacji pierwszego uruchomienia po stronie usługi WWW. Jest to serwis internetowy, który jest używany przez cały dzień, a jego zawartość pozostaje w pamięci. O ile widzę, opóźnienie występuje po stronie klienta lub między klientem a serwerem dla tego pierwszego połączenia, ale nie dla kolejnych wywołań.

Nie jestem pewien, co sprawdzić dalej. Jakieś pomysły?

+1

Należy pamiętać, że pierwsza rozmowa będzie wolniejszy, jednak nie powinno być powolne. – tier1

+1

Podejrzewam, że odpowiedź prawdopodobnie znajduje się gdzieś w tym zestawie pytań/odpowiedzi: http://stackoverflow.com/questions/6988981/webclient-is-very-slow W szczególności szukam problemów z proxy. – spender

+1

Czy masz "Automatycznie wykryj ustawienia" swojego proxy w opcjach internetowych na maszynie z wadami? – spender

Odpowiedz

9

Jak wskazał spender, problem związany był z wykrywaniem proxy. Wyłączenie tego w Internet Explorerze rozwiązało problem, ale nie było to możliwe w mojej sytuacji.

Zamiast tego istnieje obejście umożliwiające obejście domyślnego serwera proxy, a tym samym automatyczne wykrywanie.

Dodanie tych wpisów do app.config umożliwia pewne adresy ominąć proxy:

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

Więcej informacji można znaleźć tutaj: <defaultProxy Element> on MSDN

+0

Masz aplikację kliencką WinForm, która działa na pulpicie, a zmiana opcji przeglądarki internetowej pomaga w tym? Tylko ciekawostki, daj mi znać! –

+0

@MareInfinitus: To naprawdę nie jest opcja przeglądarki Internet Explorer jako taka, jest to opcja API wininet, którą Internet Explorer również używa i dostarcza GUI do konfiguracji. –

+0

Pracowałem dla mnie świetnie –

0

Wiele razy cierpiałem na ten problem - człowiek, którego nienawidzę !!! lol Chociaż nigdy nie rozwiązałam tego ostatecznie, mógłbyś spróbować kilku rzeczy. Po pierwsze, nawiąż połączenie z serwisem internetowym podczas uruchamiania i pozbądź się "bólu"! Po drugie, spróbuj poradzić sobie z pulą aplikacji IIS usługi WWW - spraw, aby nigdy się nie poddawała recyklingowi lub co najmniej robiła to w nie-boską godzinę rano lub na 10000 żądań.

Wiem, że to prawdopodobnie nie jest wspaniała odpowiedź, ale mam nadzieję, że to trochę pomaga!


EDIT:

Częścią problemu jest to, że serwis internetowy nie 'zawsze' jest gotowy - to idzie spać, recycles etc, aż będą potrzebne. Warto przeczytać o utrzymywaniu żywych serwisów internetowych, czasie pracy 5 lat itp.!

+0

Nie pomoże. OP zadał te pytania w pytaniu. – spender

+0

Prawidłowo. Apppool nie jest tutaj powiązany. ale dzięki za sugestię –

+0

Ta usługa sieciowa, w czasie moich testów, jest rzeczywiście "zawsze" w górę. Jest on wywoływany przez klientów 2-3 razy na sekundę, od 7 rano do 7 wieczorem. Rozumiem, co mówisz w odniesieniu do recyklingu pul aplikacji i tym podobnych, ale tak nie jest w tym przypadku. –

-1

Dodałem te ustawienia na moim basicHttpBinding, wyłączając automatyczne wykrywanie proxy i uzyskując duże przyspieszenie przy pierwszym uruchomieniu. To oczywiście działa dobrze, jeśli jesteś w środowisku intranetowym lub wiesz, że nie potrzebujesz żadnego proxy.

bypassProxyOnLocal = "false"

useDefaultWebProxy = "false"

Nadzieja to pomaga.

+0

-1: OP używa ASMX (Referencje w Internecie) –

2

spróbuj ustawić proxy do pustej WebProxy, tj:

request.Proxy = new WebProxy(); 

czy można zastąpić ustawienia serwera proxy w pliku .config do aplikacji za pomocą klawisza defaultProxy w sekcji System.Net. Następuje wyłączenie automatycznego wykrywania serwera proxy:

<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

Powiązane problemy