2012-01-26 3 views
2

Мне нужно сделать запрос POST с использованием .Net.Повторное соединение с HttpWebRequest в C#

Я могу выполнить проверку подлинности с помощью 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. 
} 

EDIT: Было высказано предположение, что мне необходимо передать файлы cookie. Ниже не работает либо:

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

Причина не оставаться в системе, потому что вы не даете HttpWebRequest в CookieContainer сохранить идентификатор сессии в

Смотрите следующее. StackOverflow Q & для вашего возможного решения:

C# keep session id over httpwebrequest

Multiple WebRequest in same session

Надеюсь, это помогло.

+0

Спасибо, но это не сработало (см. Править на вопрос выше) – Paul

+0

Кроме того, HttpWebResponse не содержит куки. – Paul

2

Любая идея управления аутентификацией осуществляется на другом конце? IE. Если он устанавливает куки, то вам необходимо убедиться, что вы объяснить, что увидеть это page, а именно это примечание:

Примечание

По соображениям безопасности, куки отключены по умолчанию. Если вы хотите использовать файлы cookie, используйте свойство CookieContainer для включения файлов cookie.

Смежные вопросы