2012-03-05 10 views
5

muszę wysłać żądanie takiego użyciu HttpWebRequest:Jak prawidłowo wysłać nagłówek KeepAlive w języku C#?

POST https://sap.site.com.mx/sap/bw/BEx?SAP-LANGUAGE=ES&PAGENO=1&CMD=PROCESS_VARIABLES&REQUEST_NO=0&CMD=PROCESS_VARIABLES&SUBCMD=VAR_SUBMIT&VARID= HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: es-MX,es;q=0.8,en-us;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

Jednak nie mogę wysłać nagłówek połączenia. To jest mój kod:

// request 
HttpWebRequest request = CreateWebRequestObject(url); 
request.CookieContainer = this.cc; 
request.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"; 

// headers 
request.Headers.Add("Accept-Encoding", "gzip, deflate"); 
request.Headers.Add("Accept-Language", " es-MX,es;q=0.8,en-us;q=0.5,en;q=0.3"); 
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
request.KeepAlive = true; // it does not work as expected 
request.ServicePoint.Expect100Continue = false; // remove Expect header 

// post 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = buffer.Length; 

using (Stream stream = request.GetRequestStream()) 
    stream.Write(buffer, 0, buffer.Length); 

Ale, gdy sprawdzam żądanie w Skrzypce, właściwość Połączenie nie pojawia się.

Ponadto te posty nie działa dla mnie:

  1. Keep a http connection alive in C#?
  2. C# - Connection: keep-alive Header is Not Being Sent During HttpWebRequest

Jak wysłać nagłówek połączenia poprawnie?

UPDATE

Ten dodatek Keep-Alive użyciu HTTP/1,0

request.ProtocolVersion = HttpVersion.Version10; 
//request.KeepAlive = true; // not necessary 

Kiedy zmiana nieruchomość ProtocolVersion do HttpVersion.Version11, Keep-Alive nagłówek nie jest wysłać:

request.ProtocolVersion = HttpVersion.Version11; 
request.KeepAlive = true; 

Jak mogę wysłać nagłówek Keep-Alive za pomocą Http/1.1?

+0

W http1.1 KeepAlive jest domyślny, nie? –

+0

nie, jeśli używasz ServicePointManager.Expect100Continue = false; przy okazji, mając ten sam problem. Czy jest to błąd sieci .net? –

Odpowiedz

1

Miałem ten sam błąd z bardzo podobny kod, a ustawienie

var sp = req.ServicePoint; 
var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic); 
prop.SetValue(sp, (byte)0, null); 

DID naprawić. Czy na pewno wykonujesz ten kod za każdym razem, gdy tworzysz httpwebrequest?

3

Podczas korzystania z protokołu HTTP/1.1 funkcja Keep-Alive jest domyślnie włączona. Ustawienie KeepAlive na wartość false może spowodować wysłanie połączenia: Zamknij nagłówek do serwera.

Powiązane problemy