Senden mit Hilfe von Cookies und Httpcookiecollection Cookie
-
06-07-2019 - |
Frage
Ich mag Tunnel durch eine HTTP-Anforderung von meinem Server zu einem Remote-Server, alle Cookies, die durch. So erstelle ich ein neues HttpWebRequest
Objekt und will Cookies setzen darauf.
HttpWebRequest.CookieContainer
ist Typ System.Net.CookieContainer
die System.Net.Cookies
hält.
Auf meinem eingehenden Request-Objekt:
HttpRequest.Cookies
ist Typ System.Web.HttpCookieCollection
die System.Web.HttpCookies
hält.
Grundsätzlich möchte ich in der Lage sein, sie zu einander zuzuordnen, aber die unterschiedlichen Typen macht es unmöglich. Muss ich sie konvertieren, indem ihre Werte zu kopieren, oder gibt es einen besseren Weg?
Lösung
Hier ist der Code, den ich verwendet habe, die Cookie-Objekte aus der eingehenden Anfrage an die neue HttpWebRequest ... ( „MyRequest“ ist der Name meines HttpWebRequest-Objekt.) Übertragen
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 );
}
Andere Tipps
hatte ich eine Notwendigkeit, dies heute für eine Sharepoint-Website zu tun, die formularbasierte Authentifizierung (FBA) verwendet. Wenn Sie versuchen, eine Anwendung Seite aufrufen, ohne die Cookies Klonen und die Zuweisung ein Cookie Objekt dann wird die Anforderung fehlschlagen.
Ich entschied mich zu abstrahieren den Job zu dieser praktischen Erweiterung Methode:
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;
}
}
Sie können dann rufen Sie einfach es von jedem Httprequest-Objekt mit einem Ziel HttpWebRequest-Objekt als Parameter, zum Beispiel:
HttpWebRequest request;
request = (HttpWebRequest)WebRequest.Create(TargetUrl);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.CookieContainer = SourceRequest.GetCookieContainer(request);
request.BeginGetResponse(null, null);
wo TargetURL ist die URL der Seite, die ich bin nach und SourceRequest ist die Httprequest der Seite, die ich auf zur Zeit bin, über Page.Request abgerufen werden.
Der von David vorgeschlagen ist die richtige. Sie müssen kopieren. Einfach nur Funktion erstellen wiederholt zu kopieren. Http und Cookie-Objekt wird erstellt, um sicherzustellen, dass wir sowohl in ihrer Funktionalität unterscheiden können und wo sie kommen. Http zwischen Benutzer und Ihre Proxy verwendet Cookies zwischen Ihrem Proxy und Remote-Web-Server verwendet wird.
Http hat weniger Funktionen, da das Cookie von Ihnen entstanden ist und Sie wissen, wie es zu handhaben. Cookie Sie Cookies von Web-Server empfangen zu verwalten. Wie Cookie, kann es verwendet werden, Domain, Pfad und Ablauf zu verwalten.
So Benutzerseite und Web-Server-Seite unterschiedlich ist und es zu verbinden, sicher, Sie brauchen es zu konvertieren. In Ihrem Fall ist es einfach nur eine direkte Zuordnung.
Beachten Sie, dass Cookie hat einen Bug auf .Add (Cookie) und .GetCookies (uri) -Methode.
, um die Details sehen und beheben hier:
http: // dot -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html
CallMeLaNN