2012-01-26 2 views
2

.Net을 사용하여 POST 요청을해야합니다.C#에서 HttpWebRequest와의 연결 재사용

GET으로 인증 할 수 있으므로 인증을 유지하기 위해 동일한 연결에서 POST 요청을하려고합니다.

문제는 401 Not Authenticated 예외가 발생하여 연결이 다시 사용되지 않았 음을 의미합니다.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my-server"); 
request.Credentials = new NetworkCredential("user", "password"); 

request.GetResponse().Close(); // Works fine 

// Now the request I want to make... 

request = (HttpWebRequest)WebRequest.Create("my-server"); 
request.Credentials = new NetworkCredential("user", "password"); 

request.Method = "post"; 

string postData = "param1=1&param2=2"; 
byte[] data = new ASCIIEncoding().GetBytes(postData); 
request.ContentLength = data.Length; 
request.ContentType = "application/x-www-form-urlencoded"; 

using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(data, 0, data.Length); 
    stream.Close(); 
    request.GetResponse().Close();  // This line gets a 401 Not Authorized error. 
} 

편집 : 쿠키를 전송해야한다는 몇 가지 제안이있었습니다. 다음은 작동하지 않습니다 중 하나

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my-server"); 
request.Credentials = new NetworkCredential("user", "password"); 

var response = (HttpWebResponse)request.GetResponse(); 

var cookieContainer = new CookieContainer(); 
foreach (Cookie cookie in response.Cookies) 
{ 
    cookieContainer.Add(cookie); 
} 

response.Close(); 

// Now the request I want to make... 

request = (HttpWebRequest)WebRequest.Create("my-server"); 
request.Credentials = new NetworkCredential("user", "password"); 
request.CookieContainer = cookieContainer; 

request.Method = "post"; 

string postData = "param1=1&param2=2"; 
byte[] data = new ASCIIEncoding().GetBytes(postData); 
request.ContentLength = data.Length; 
request.ContentType = "application/x-www-form-urlencoded"; 

using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(data, 0, data.Length); 
    request.GetResponse().Close();  // This line gets a 401 Not Authorized error. 
} 
+0

중복 가능성 [재사용 HttpWebRequest를? (http://stackoverflow.com/questions/2179626/reuse-a-httpwebrequest) –

+0

응답을 닫고 있던 않음. 세 번째 줄에서이 작업을 수행했습니다. – Paul

+0

"사용 중"은 자동으로 스트림을 닫습니다. 따라서 "stream.Close();" 도움이 될 것입니다. –

답변

5

당신이 로그인 상태를 유지하지 않는 이유는 당신의 세션 ID를 유지하기 위해 HttpWebRequest를 CookieContainer를 제공하지 않기 때문에

을에 다음을 참조하십시오. StackOverflow의 Q & A의 당신의 가능한 솔루션 :

C# keep session id over httpwebrequest

Multiple WebRequest in same session

도움이 되었기를 바랍니다.

+0

고마워,하지만이 작동하지 않았다 (위에 질문에 편집 참조) – Paul

+0

또한 HttpWebResponse 쿠키가 포함되어 있지 않습니다. – Paul

2

인증이 다른 쪽에서 어떻게 관리되고 있는지 알기 원하십니까? IE. 이 쿠키를 설정하는 경우, 당신은 당신이 차지하고 있는지 확인해야합니다, 특히이 메모이 page을보고, : 보안상의 이유로

을, 쿠키는 기본적으로 비활성화되어 있습니다. 쿠키를 사용하려면 CookieContainer 속성을 사용하여 쿠키를 활성화하십시오.