2010-04-25 6 views
4

Je cherche un moyen de travailler avec une API qui nécessite une connexion, puis redirige vers une autre URL. Le fait est que jusqu'ici, je n'ai trouvé qu'un moyen de faire 2 requêtes Http pour chaque action que je veux faire: d'abord, obtenir cookie avec AllowRedirect = false, puis obtenir l'URI réelle et faire une deuxième requête avec le cookie:C# Envoyer un cookie dans un HttpWebRequest qui est redirigé

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

Il semble terriblement inefficace. Y a-t-il un autre moyen?
Merci!

Répondre

0

Il semble terriblement inefficace.

Pourquoi? En fin de compte, tout est HttpWebRequest, avec AllowAutoRedirect true va faire.

+0

OK, et le code, est-ce qu'il n'y a pas une meilleure façon de mettre en œuvre cela? – Nir

+0

@Nir: pas particulièrement (puisque vous ne définissez rien d'autre pour la requête d'origine). – Richard

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