2012-10-23 22 views
10

Quando si accede il processo di login utilizzando Firebug vedo che è cosìWebClient non reindirizza automaticamente

POST //The normal post request 
GET //Automatically made after the login 
GET //Automatically made after the login 
GET //Automatically made after the login 

Quando si effettua una richiesta POST usando il mio codice qui sotto non ha fatto le richieste automatiche ottenere che il browser è facendo.

MY WebClient Handler

using System; 
using System.Net; 

namespace Test 
{ 
    class HttpHandler : WebClient 
    { 
     private CookieContainer _mContainer = new CookieContainer(); 

     protected override WebRequest GetWebRequest(Uri address) 
     { 
      var request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = _mContainer; 
      } 
      return request; 
     } 

     protected override WebResponse GetWebResponse(WebRequest request) 
     { 
      var response = base.GetWebResponse(request); 
      if (response is HttpWebResponse) 
       _mContainer.Add((response as HttpWebResponse).Cookies); 
      return response; 
     } 

     public void ClearCookies() 
     { 
      _mContainer = new CookieContainer(); 
     } 
    } 
} 

Utilizzando codice

private static async Task<byte[]> LoginAsync(string username, string password) 
{ 
    var postData = new NameValueCollection(); 
    var uri = new Uri(string.Format("http://{0}/", ServerName)); 

    postData.Add("name", username); 
    postData.Add("password", password); 

    return await HttpHandler.UploadValuesTaskAsync(uri, postData); 
} 

Quando si cerca di rintracciare la connessione della mia applicazione si sta solo facendo la richiesta POST e non il resto richieste GET. [CHE SONO EFFETTUATI AUTOMATICAMENTE NEL BROWSER]

+0

Fallisce anche nella versione sincrona? Con AllowAutoRedirect, mi aspetto che funzioni ... forse è un problema con il reindirizzamento dal POST? –

risposta

1

Ciò non dovrebbe sorprendere, dato che HttpWebRequest non è un browser. Se è necessario eseguire questi reindirizzamenti, controllare lo HttpWebResponse.StatusCode e fare un'altra richiesta se si tratta di un redirect code in the 300's. Nota dal link sotto 10.3 Reindirizzamento 3xx:

Questa classe di codice di stato indica che l'agente utente deve intraprendere ulteriori azioni per soddisfare la richiesta. L'azione richiesta PU MAY essere eseguita dall'agente utente senza interazione con l'utente se e solo se il metodo utilizzato nella seconda richiesta è GET o HEAD. Un client DOVREBBE rilevare infiniti cicli di reindirizzamento, dal momento che tali loop generano traffico di rete per ogni reindirizzamento.

+8

Dato HttpWebRequest.AllowAutoRedirect, mi aspetterei * che funzioni ... –

+1

Il webclient ha AllowAutoRedirect true automaticamente –

+0

@dbaseman sto chiedendo su WebClient non il derivato HttpWebResponse & Request –

7

Prova ad aggiungere

request.AllowAutoRedirect = true; 

proprio sotto il

var request = base.GetWebRequest(address); 

E 'risolto qualche problema simile per me, anche che autoredirect dovrebbe essere attivato per default.