2012-10-23 13 views
10

Po zalogowaniu proces logowania przy użyciu Firebug widzę, że to jest jak toWebClient nie oznacza automatycznie przekierować

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

Przy składaniu wniosku Post używając mojego kodu poniżej nie dokona automatycznego żądania GET że przeglądarkach robić.

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

pomocą kodu

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

Gdy próbuje śledzić połączenia mojego wniosku, że robi tylko żądanie POST, a nie reszta żądań GET. [ZOSTANIE AUTOMATYCZNIE WYKONANE W PRZEGLĄDARCE]

+0

Czy to też nie działa w wersji synchronicznej? Z AllowAutoRedirect, oczekiwałbym, że to zadziała ... być może jest to problem z przekierowaniem z POST? –

Odpowiedz

1

To nie powinno być zaskakujące, ponieważ HttpWebRequest nie jest przeglądarką. Jeśli chcesz wykonać te przekierowania, sprawdź numer HttpWebResponse.StatusCode i wprowadź inne żądanie, jeśli jest to redirect code in the 300's. Uwaga od łącza pod 10.3 Przekierowanie 3xx:

Ta klasa kodu statusu wskazuje, że agent użytkownika musi podjąć dalsze działania, aby spełnić żądanie. Wymagana czynność MOŻE być przeprowadzona przez klienta użytkownika bez interakcji z użytkownikiem wtedy i tylko wtedy, gdy metoda zastosowana w drugim żądaniu jest GET lub HEAD. Klient POWINIEN wykrywać nieskończone pętle przekierowania, ponieważ takie pętle generują ruch sieciowy dla każdego przekierowania.

+8

Biorąc pod uwagę HttpWebRequest.AllowAutoRedirect, mógłbym * oczekiwać, że * to zadziała ... –

+1

WebClient ma mieć AllowAutoRedirect true automatycznie –

+0

@dbaseman Pytam o WebClient a nie pochodną HttpWebResponse & Request –

7

spróbuj dodać

request.AllowAutoRedirect = true; 

tuż pod

var request = base.GetWebRequest(address); 

to rozwiązać jakiś podobny problem dla mnie, mimo że autoredirect ma być domyślnie włączona.

Powiązane problemy