C#在重定向的HttpWebRequest中发送cookie

4
我正在寻找一种与需要登录并重定向到另一个URL的API进行交互的方法。
问题是,到目前为止,我只想出了一种每个操作都需要进行2个Http请求的方法:首先使用AllowRedirect=false获取cookie,然后获取实际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
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
“它看起来效率极低。”
“为什么?”
“最终,这就是所有使用 'HttpWebRequest' 和 'AllowAutoRedirect true' 的内容。”

好的,就代码而言,难道没有更好的实现方法吗? - Nir
@Nir:没有特别的要求(因为您没有为原始请求设置其他内容)。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接