Проблема с запросом http 'POST' - PullRequest
2 голосов
/ 01 мая 2011

У меня тупая проблема. У меня есть метод, который возвращает инициализированный запрос для повторной регистрации на каком-то внешнем веб-сайте.

protected HttpWebRequest GetLoginRequest()
{
    const string url = "https://someurl.com/login";

    var queryParams = new ArrayList
                          {
                              String.Format("{0}={1}", "email", Email),
                              String.Format("{0}={1}", "password", DecryptedPassword)
                          };

    var parameters = String.Join("&", (String[])queryParams.ToArray(typeof(String)));

    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = parameters.Length;
    request.Timeout = 10000;

    var streamWriter = new StreamWriter(request.GetRequestStream());
    streamWriter.Write(parameters);
    streamWriter.Close();

    return request;
}

Я вызываю этот метод из двух мест в моем коде. Первый звонок выглядит так:

var request = GetLoginRequest();

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

И второй имеет CookieContainer, назначенный на запрос:

var cookieContainer = new CookieContainer();

var request = GetLoginRequest();
request.CookieContainer = cookieContainer;

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

потому что мне нужно хранить CookieContainer.

Дело в том, что вход выполняется только во втором случае. В первом случае я получаю ответ со страницы входа. Я проверил все случаи, и оба получающихся запроса кажутся идентичными. Я бы предположил, что это целевой сайт, но все же я не вижу причин для этого.

Не могли бы вы объяснить, в чем причина, потому что это поведение кажется мне довольно неочевидным.

1 Ответ

3 голосов
/ 01 мая 2011

Когда вы задаете свойство CookieContainer для вашего запроса, ответ заполняет этот экземпляр CookieContainer файлами cookie, полученными из выполненного запроса.

Большинство механизмов входа в систему используют cookie для хранения состояния, связанного с установленным именем входа. То есть в случае проверки подлинности с помощью форм cookie является контейнером для проверки подлинности с помощью форм. Билет передается как значение файла cookie проверки подлинности форм с каждым запросом и используется для проверки подлинности форм на сервере для идентификации пользователя, прошедшего проверку подлинности.

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

Изменить для уточнения комментария - от MSDN :

CookieContainer по умолчанию равен нулю. Вы должны назначить CookieContainer возражать против собственности, чтобы иметь куки возвращается в собственность Cookies HttpWebResponse, возвращаемый Метод GetResponse.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...