C # Отправка куки в HttpWebRequest, который перенаправлен - PullRequest
4 голосов
/ 25 апреля 2010

Я ищу способ работы с API, который требует входа в систему, а затем перенаправляет на другой URL.
Дело в том, что до сих пор я только придумал способ сделать 2 Http-запроса для каждого действия, которое я хочу сделать: сначала получить cookie с AllowRedirect = false, затем получить фактический URI и сделать второй запрос с cookie :

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sUrl);
request.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

string redirectedUrl = response.Headers["Location"];
if (!String.IsNullOrEmpty(redirectedUrl))
{
    redirectedUrl = "http://www.ApiUrlComesHere.com/" + redirectedUrl;
    HttpWebRequest authenticatedRequest = (HttpWebRequest)WebRequest.Create(redirectedUrl);
    authenticatedRequest.Headers["Cookie"] = response.Headers["Set-Cookie"];        
    response = (HttpWebResponse)request.GetResponse();
}

Это кажется ужасно неэффективным. Есть ли другой способ?
Спасибо!

Ответы [ 2 ]

1 голос
/ 09 февраля 2012
public String Post(String url, IDictionary<String, String> data)
    {
        String requestData = String.Join("&", data.Select(x => String.Format("{0}={1}", HttpUtility.UrlEncode(x.Key), HttpUtility.UrlEncode(x.Value))));

        Byte[] requestBytes = Encoding.UTF8.GetBytes(requestData);

        CookieContainer cookies = new CookieContainer();

        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.CookieContainer = cookies;
        request.Method = WebRequestMethods.Http.Post;
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = requestBytes.Length;
        request.AllowAutoRedirect = false;

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(requestBytes, 0, requestBytes.Length);
        requestStream.Close();

        HttpWebResponse response = request.GetResponse() as HttpWebResponse;

        while (response.StatusCode == HttpStatusCode.Found)
        {
            response.Close();

            String location = response.Headers[HttpResponseHeader.Location];

            request = WebRequest.Create(location) as HttpWebRequest;
            request.CookieContainer = cookies;
            request.Method = WebRequestMethods.Http.Get;

            response = request.GetResponse() as HttpWebResponse;
        }

        String responseData = this.Read(response.GetResponseStream());

        response.Close();

        return (responseData);
    }
0 голосов
/ 25 апреля 2010

Это кажется ужасно неэффективным.

Почему?

В конце концов, это все HttpWebRequest, с AllowAutoRedirect true.

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