【问题标题】:C# Sending cookie in an HttpWebRequest which is redirectedC# 在重定向的 HttpWebRequest 中发送 cookie
【发布时间】:2013-09-13 18:37:13
【问题描述】:

我正在寻找一种方法来使用需要登录的 API,然后重定向到另一个 URL。
问题是,到目前为止,我只想出了一种方法来为我想要执行的每个操作发出 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();
}

这似乎非常低效。还有其他方法吗?
谢谢!

【问题讨论】:

    标签: c# api cookies httpwebrequest


    【解决方案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);
        }
    

    【讨论】:

      【解决方案2】:

      这似乎非常低效。

      为什么?

      最后这就是HttpWebRequestAllowAutoRedirect true 要做的事情。

      【讨论】:

      • 好的,而且在代码方面,没有更好的方法来实现这一点吗?
      • @Nir:不是特别的(因为您没有为原始请求设置任何其他内容)。
      猜你喜欢
      • 2014-04-12
      • 2015-09-16
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2013-06-13
      • 2013-03-18
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多