2009-07-31 16 views
24

Chcę tunelować przez żądanie HTTP z mojego serwera na serwer zdalny, przechodząc przez wszystkie pliki cookie. Dlatego tworzę nowy obiekt HttpWebRequest i chcę ustawić na nim pliki cookie.Wysyłanie plików cookie przy użyciu HttpCookieCollection i CookieContainer

HttpWebRequest.CookieContainer to typ System.Net.CookieContainer, który ma System.Net.Cookies.

Na moim przychodzące żądanie obiektu:

HttpRequest.Cookies jest typu System.Web.HttpCookieCollection która utrzymuje System.Web.HttpCookies.

Zasadniczo chcę móc je przypisać do siebie, ale różne typy uniemożliwiają. Czy muszę je przekonwertować, kopiując ich wartości, czy jest lepszy sposób?

Odpowiedz

34

Oto kod użyłem do przenoszenia przedmiotów cookies z żądania przychodzące do nowego HttpWebRequest ... („myRequest” to nazwa mojego HttpWebRequest obiektu.)

HttpCookieCollection oCookies = Request.Cookies; 
for (int j = 0; j < oCookies.Count; j++) 
{ 
    HttpCookie oCookie = oCookies.Get(j); 
    Cookie oC = new Cookie(); 

    // Convert between the System.Net.Cookie to a System.Web.HttpCookie... 
    oC.Domain = myRequest.RequestUri.Host; 
    oC.Expires = oCookie.Expires; 
    oC.Name  = oCookie.Name; 
    oC.Path  = oCookie.Path; 
    oC.Secure = oCookie.Secure; 
    oC.Value = oCookie.Value; 

    myRequest.CookieContainer.Add(oC); 
} 
+0

Myślę, że ta technika zadziała, ale naprawdę liczyłem na rozwiązanie, które nie wymagałoby kopiowania każdej wartości. – Mike

+0

co z próbą z pustym haczykiem? – CRice

+0

Dobra uwaga, została usunięta. – David

1

Sugerowana od David jest właściwy. Musisz skopiować. Po prostu utwórz funkcję do wielokrotnego kopiowania. Obiekt HttpCookie i Cookie jest tworzony, aby zapewnić, że możemy rozróżnić zarówno jego funkcjonalność, jak i miejsce, w którym się znajduje. HttpCookie używane między użytkownikiem a twoim serwerem proxy Cookie jest używane między twoim serwerem proxy a zdalnym serwerem WWW.

HttpCookie ma mniej funkcji, ponieważ ciasteczko pochodzi od Ciebie i wiesz, jak sobie z nim radzić. Cookie zapewnia zarządzanie ciasteczkami otrzymanymi z serwera WWW. Podobnie jak CookieContainer, może być używany do zarządzania domeną, ścieżką i wygasaniem.

Strona po stronie użytkownika i serwera WWW jest inna, więc aby ją podłączyć, należy ją przekonwertować. W twoim przypadku to po prostu bezpośrednie zadanie.

Należy zauważyć, że plik CookieContainer zawiera błąd w metodach .Add (Cookie) i .GetCookies (uri).

Zobacz szczegóły i naprawić tutaj:

http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

CallMeLaNN

3

miałem trzeba to zrobić dzisiaj dla witryny programu SharePoint, który używa Forms Based Authentication (FBA). Jeśli spróbujesz wywołać stronę aplikacji bez klonowania plików cookie i przypisania obiektu CookieContainer, żądanie nie powiedzie się.

wybrałem streszczenie pracy do tej poręcznej metodę rozszerzenia:

public static CookieContainer GetCookieContainer(this System.Web.HttpRequest SourceHttpRequest, System.Net.HttpWebRequest TargetHttpWebRequest) 
    { 
     System.Web.HttpCookieCollection sourceCookies = SourceHttpRequest.Cookies; 
     if (sourceCookies.Count == 0) 
      return null; 
     else 
     { 
      CookieContainer cookieContainer = new CookieContainer(); 
      for (int i = 0; i < sourceCookies.Count; i++)     
      { 
       System.Web.HttpCookie cSource = sourceCookies[i]; 
       Cookie cookieTarget = new Cookie() { Domain = TargetHttpWebRequest.RequestUri.Host, 
                Name = cSource.Name, 
                Path = cSource.Path, 
                Secure = cSource.Secure, 
                Value = cSource.Value }; 
       cookieContainer.Add(cookieTarget); 
      } 
      return cookieContainer; 
     } 
    } 

Następnie można po prostu zadzwonić z dowolnego obiektu HttpRequest z tarczy HttpWebRequest obiekt jako parametr, na przykład:

HttpWebRequest request;     
request = (HttpWebRequest)WebRequest.Create(TargetUrl); 
request.Method = "GET"; 
request.Credentials = CredentialCache.DefaultCredentials; 
request.CookieContainer = SourceRequest.GetCookieContainer(request);     
request.BeginGetResponse(null, null); 

gdzie TargetUrl to adres URL strony, po której się znajdujesz, a SourceRequest to HttpRequest strony, na której aktualnie się znajduję, pobierana przez Page.Request.

Powiązane problemy