2010-04-25 94 views
4

我正在寻找一种方式与需要登录,然后重定向到另一个网址的API来工作。
问题是,到目前为止,我只来了一个办法,使因为我想要做的每个动作2个的HTTP请求:第一,与AllowRedirect得到饼干= false,那么得到实际的URI,并做了第二次请求与该cookie:C#中的HttpWebRequest的其中发送的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(); 
} 

这似乎非常低效。有另一种方法吗?
谢谢!

回答

0

似乎非常低效的。

为什么?

到底这是所有HttpWebRequest,用AllowAutoRedirect true是要干什么。

+0

好吧,代码方面,没有更好的方法来实现这个吗? – Nir 2010-04-25 13:54:43

+0

@Nir:没有特别的(因为你没有设置任何其他为原始请求)。 – Richard 2010-04-26 10:51:07

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); 
    }