2016-11-25 3 views
0

Meine C# -App macht einige Arbeit auf der Website. Ich möchte dasselbe Cookie verwenden, anstatt jedes Mal, wenn ich meine Anwendung starte, ein neues zu erstellen. Ich möchte Cookie in Datenbank speichern oder serialisieren.Speichern und Abrufen von Cookies

Der Code ist:

CookieContainer cookie = new CookieContainer(); 

private string getRequest(string url, CookieContainer cookie, string postData = "") 
{ 
    System.Net.ServicePointManager.Expect100Continue = true; 
    StreamReader reader; 

    var request = WebRequest.Create(url) as HttpWebRequest; 
    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"; 
    request.CookieContainer = cookie; 
    request.AllowAutoRedirect = true; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Headers.Add("X-Requested-With", "XMLHttpRequest"); 

    postData = Uri.EscapeUriString(postData); 

    request.Method = "POST"; 
    request.ContentLength = postData.Length; 

    Stream requestStream = request.GetRequestStream(); 
    Byte[] postBytes = Encoding.ASCII.GetBytes(postData); 

    requestStream.Write(postBytes, 0, postBytes.Length); 
    requestStream.Close(); 

    HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

    foreach (Cookie tempCookie in response.Cookies) 
    { 
     cookie.Add(tempCookie); 
    } 

    reader = new StreamReader(response.GetResponseStream()); 
    string readerReadToEnd = reader.ReadToEnd(); 
    response.Close(); 

    foreach (Cookie _cookie in response.Cookies) 
    { 
     Console.WriteLine("1. Version: {0}", _cookie.Version); 
     Console.WriteLine("2. Value: {0}", _cookie.Value); 
     Console.WriteLine("3. TimeStamp: {0}", _cookie.TimeStamp); 
     Console.WriteLine("4. Secure: {0}", _cookie.Secure); 
     Console.WriteLine("5. Port: {0}", _cookie.Port); 
     Console.WriteLine("6. Path: {0}", _cookie.Path); 
     Console.WriteLine("7. Name: {0}", _cookie.Name); 
     Console.WriteLine("8. HttpOnly: {0}", _cookie.HttpOnly); 
     Console.WriteLine("9. Expires: {0}", _cookie.Expires); 
     Console.WriteLine("10. Expired: {0}", _cookie.Expired); 
     Console.WriteLine("11. Domain: {0}", _cookie.Domain); 
     Console.WriteLine("12. Discard: {0}", _cookie.Discard); 
     Console.WriteLine("13. CommentUri: {0}", _cookie.CommentUri); 
     Console.WriteLine("14. Comment: {0}", _cookie.Comment); 
     Console.WriteLine("String: {0}", _cookie.ToString()); 
    } 

    return readerReadToEnd; 
} 

Als ich betreibe meine Anwendung, die ich mit der gleichen Instanz von cookie arbeite. Aber wenn ich die Anwendung erneut starte, ist der Cookie anders. Ich möchte immer das selbe verwenden.

Console Ausgabe gibt mir dies:

1. Version: 0 
2. Value: rujd49p08kthfcuf7itdgnhkap5jideg 
3. TimeStamp: 2016-11-25 21:58:06 
4. Secure: False 
5. Port: 
6. Path:/
7. Name: PHPSESSID 
8. HttpOnly: True 
9. Expires: 0001-01-01 00:00:00 
10. Expired: False 
11. Domain: example-site.com 
12. Discard: False 
13. CommentUri: 
14. Comment: 
String: PHPSESSID=rujd49p08kthfcuf7itdgnhkap5jideg 

Also meine Frage ist: kann ich meine Cookie speichern und das gleiche Cookie zum Beispiel 1 Tag später verwenden?

Antwort

0

Sie können die CookieContainer auf der Festplatte serialisiert mit einem BinaryFormatter:

var bf = new BinaryFormatter(); 
var wstr = File.OpenWrite(@"C:\some\location\cookies.bin"); 
bf.Serialize(wstr, cookieContainer); 
wstr.Close(); 

Dann können Sie die Sammlung zurück aus der gespeicherten Datei zu einem späteren Durchlauf der Anwendung lesen (oder wann immer):

var rstr = File.OpenRead(@"C:\some\location\cookies.bin"); 
var cookieContainer = (CookieContainer)new BinaryFormatter().Deserialize(rstr); 

Dann können Sie diesen deserialisierten cookieContainer der HttpWebRequest.CookieContainer zuordnen, bevor Sie Ihre Anfrage stellen, und er wird die gespeicherten Cookies verwenden - , wenn diese Cookies nicht abgelaufen sind b y die Zeit, die Sie versuchen, sie wieder zu verwenden.

Die PHPSESSID-Cookie Sie erwähnen, ist eine Session-Cookie ohne expliziten Ablauf - Sie können speichern und wiederverwenden es so, wie Sie hier wollen, aber es wird als die nach wie vor nur tatsächlich Arbeit so lange PHP auf dem Server hält diese Sitzung für gültig.

Außerdem sollten Sie nicht brauchen diese in Ihrem Code zu tun:

foreach (Cookie tempCookie in response.Cookies) 
{ 
    cookie.Add(tempCookie); 
} 

Sie haben bereits gesetzt request.CookieContainer = cookie in Ihrem Code (wo cookie ist ein CookieContainer) - damit fertig, die Plätzchen erhalten in Die Antwort wird automatisch in die CookieContainer eingegeben, Sie müssen dies nicht manuell tun.

+0

Wow, danke für die Antwort. Ich frage mich, ob es eine Möglichkeit gibt, meine Cookies in der SQL-Server-Datenbank zu speichern, zum Beispiel durch Speichern als Bytes. Hast du damit Erfahrung? – Dawvawd

+0

Es gibt eine Reihe von Möglichkeiten, wie Sie die serialisierte Darstellung in SQL speichern könnten: – bookdev

+0

Sie würden immer noch den BinaryFormatter verwenden, aber Sie würden in einen 'MemoryStream' schreiben und dann' ToArray() 'darauf aufrufen, um das Array zu erhalten von Rohbytes der serialisierten Darstellung. Von dort können Sie es in SQL in einem 'binary' /' varbinary' Feld speichern, oder Sie können 'Convert.ToBase64String (bytes)' aufrufen, um es in einen base64 String umzuwandeln, der in einem einfachen alten 'varchar' oder 'nvarchar'-Feld und kehrte dann mit' FromBase64String() 'in die Byte-Array-Form zurück. Sie können schließlich den BinaryFormatter verwenden, um Ihren 'CookieContainer' zu einem beliebigen Stream zu serialisieren/deserialisieren. – bookdev