Повторное использование соединения с HttpWebRequest в C # - PullRequest
2 голосов
/ 27 января 2012

Мне нужно сделать запрос POST, используя .Net.

Я могу аутентифицироваться с помощью 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.
}

РЕДАКТИРОВАТЬ: Были некоторые предложения, которые мне нужны для передачи файлов 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.
}

Ответы [ 2 ]

5 голосов
/ 27 января 2012

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

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

C # сохранить идентификатор сеанса через httpwebrequest

Несколько веб-запросов в одном сеансе

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

2 голосов
/ 27 января 2012

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

Примечание

В целях безопасности куки-файлы по умолчанию отключены. Если вы хотите использовать куки, используйте свойство CookieContainer, чтобы включить куки.

...