Sonntag, 15. März 2015

HTTP Argumentübertragung (GET oder POST) mit Cookies in C#

Im Internet habe ich mehrere Erklärungen gefunden, wie man Cookies in C# für HTTP GET oder POST Anfragen benutzt, diese waren jedoch meistens etwas lang und kompliziert. Aus diesem Grund möchte ich hier eine Methode vorstellen, die meiner Meinung nach die einfachste ist: Mit nur 2 Zeilen können wir Cookies speichern / abrufen und so zum Beispiel PHP Sessions aufrecht erhalten und benutzen.
Wir benutzen dafür die in einem vorigen Post vorgestellte Klasse HttpWebRequest. Diese hat eine Eigenschaft CookieContainer, in welchen wir Cookies schreiben können oder von diesem auslesen können. Benutzen wir einen Webservice, welcher Cookies benutzt, zum ersten Mal, wird bei der Anfrage ein Cookie erzeugt und in dem CookieContainer gespeichert. Diesen speichern wir dann einfach in einer globalen Variablen, und setzen diese als CookieContainer beim nächsten Aufruf. So wird der Cookie wiederverwendet und der Webservice erkennt uns wieder.
Im folgenden Beispiel wird das PHP Beispiel zu Sessions aus dem vorigen Post verwendet. Das PHP Skript wird 2mal aufgerufen, durch die Verwendung von Cookies erkennt uns dieses beim 2. Besuch wieder:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;
using System.IO;

namespace PHPPost
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        CookieContainer Cookie = null;

        private void Form1_Load(object sender, EventArgs e)
        {
            Cookie = new CookieContainer(); // important
            PerformRequest();
            PerformRequest();
        }

        private void PerformRequest()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://bloggeroliver.bplaced.net/PHPExamples/session.php");
            request.CookieContainer = Cookie; // use the global cookie variable
            string postData = "";
            byte[] data = Encoding.UTF8.GetBytes(postData);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
            request.ContentLength = data.Length;

            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }

            WebResponse response = (HttpWebResponse)request.GetResponse();
            string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
        }
    }
}

Lassen wir in de Funktion PerformRequest() die 2. Zeile mit dem CookieContainer weg, erkennt uns das Skript logischerweise nicht mehr. Wichtig ist auch die Zeile Cookie = new CookieContainer(); zur Initialisierung, denn sonst kann der Container nicht verwendet werden.

Keine Kommentare:

Kommentar veröffentlichen