2016-01-28 24 views
5

Stworzyłem aplikację, która może uzyskiwać dostęp i kontrolować kamery Onvif, które dobrze sobie radzi. Jest to jednak moja pierwsza aplikacja, która korzysta z takich żądań internetowych (lub wcale), więc zakładam, że prawdopodobnie używam dość podstawowych technik. Część kodu Jestem ciekaw to:Sposoby przyspieszenia WebRequests?

 Uri uri = new Uri(
      String.Format("http://" + ipAddr + "/onvif/" + "{0}", Service)); 

     WebRequest request = WebRequest.Create((uri)); 
     request.Method = "POST"; 

     byte[] b = Encoding.ASCII.GetBytes(PostData); 
     request.ContentLength = b.Length; 
     //request.Timeout = 1000; 
     Stream stream = request.GetRequestStream(); 
     //Send Message 
     XmlDocument recData = new XmlDocument(); 
     try 
     { 
      using (stream = request.GetRequestStream()) 
      { 
       stream.Write(b, 0, b.Length); 
      } 
      //Store response 
      var response = (HttpWebResponse) request.GetResponse(); 
      if (response.GetResponseStream() != null) 
      { 
       string responsestring = new 
        StreamReader(response.GetResponseStream()) 
        .ReadToEnd(); 
       recData.LoadXml(responsestring); 
      } 
     } 
     catch (SystemException e) 
     { 
      MessageBox.Show(e.Message); 
     } 
     return recData; 
    } 

Kod działa poprawnie, jednak za pomocą sprawozdań WriteLine Odkryłem, że pierwszy wniosek trwa około 400ms do ukończenia natomiast tylko kolejne z nich trwa od 10 - 20 ms. Czy jest coś, co mogę zrobić, aby przyspieszyć pierwszą prośbę?

+1

To dobry link. Ustawienie request.Proxy na null powinno pomóc w pierwszej prośbie. –

Odpowiedz

5

Robisz to dobrze. Przyczyną różnicy w czasie może być HTTP Keep-Alive. Domyślnie to samo połączenie jest ponownie wykorzystywane w przypadku kolejnych żądań. Tak więc pierwsze żądanie musi nawiązać połączenie, i prawdopodobnie dlatego trwa dłużej. Pozostałe żądania korzystają z tego samego już otwartego połączenia.

+1

Aby to sprawdzić, może ustawić 'request.KeepAlive = false' i sprawdzić, co się stanie. –

+0

Pozdrawiam za komentarze, ustawienie serwera proxy na wartość null ograło kilka milisekund, ale myślę, że to tylko jedna z tych rzeczy. –

0

Oprócz potencjalnych problemów z siecią i serwerem samo żądanie ma znaczenie. Możesz zmniejszyć rozmiar żądania lub podzielić go i asynchronicznie załadować pliki.

Serwery WWW po wyjęciu z pudełka nie zajmie 400ms, aby wypełnić proste żądanie.

+0

Żądanie musi być zgodne ze standardem onvif, jest dość nieporęczne z zaszyfrowanym hasłem w nagłówku, niestety nie mogę wiele z tym zrobić. –

Powiązane problemy