HTML Form Data with c# as GET

Vor ein paar Jahren habe ich mal eine Klasse entwickelt, die es erlaubt mit ASP.NET ein HTML-Formular abzusenden, ohne dieses wirklich auf der ASPX oder ASCX Seite im HTML Quellcode stehe zu haben. So etwas ist z.B. sehr nützlich, wenn man externe Schnittstellen mit Daten beliefern möchte. Die Basics dazu können in meinem ersten Artikel Posting Form Data with c# nachgelesen werden.

Im Zuge der Entwicklung meines Social Networks Publishing-Dienst, kam ich heute aber an die Grenze der Klasse, da ich eine Schnittstelle nicht über das HTTP-Verb POST sondern GET ansprechen muss. Zunächst sah dieses recht einfach aus, da man bei der .NET Klasse HttpWebRequest das Verb über die Property METHOD definieren kann.
Allerdings bekam ich beim Versenden des Formulars - oder viel mehr beim Aufruf der URL immer eine Fehlermeldung:

"Inhaltsteil mit diesem Verbtyp kann nicht gesendet werden."

Nach genauer Betrachtung was passiert war mir klar, dass es nicht direkt der Aufruf der URL ist, der diesen Fehler verursacht sondern viel mehr die Tatsache das die Klasse ja versucht einen Stream öffnet um die POST-Daten damit zu übermitteln. Bei der Methode GET ist dieses aber nicht notwendig und somit wird die Verarbeitung mit der Fehlermeldung abgebrochen.

Damit die Methode "Send" der Klasse nun sowohl POST als auch GET verarbeiten kann, habe ich den Code wie folgt verändert.

public string Send(string content2Post)
 {
     string sPostData = "" ;

     
     //Zusammensetzen der Daten für die Übermittlung
     if (string.IsNullOrEmpty(content2Post))
         sPostData = GetContentToPost();
     else
         sPostData = content2Post;
     
    
     Uri sUri = null;
     HttpWebRequest request = null;

     if (this.Method == "POST")
     {

         sUri = new Uri(this.Url) ;

         request = (HttpWebRequest)WebRequest.Create(sUri);
         request.Method = Method; // "POST";
         request.ContentType = "application/x-www-form-urlencoded";
         request.ContentLength = sPostData.Length;

         Stream writeStream = request.GetRequestStream();
         System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
         byte[] bytes = encoding.GetBytes(sPostData);
         writeStream.Write(bytes, 0, bytes.Length);
         writeStream.Close();
     }
     else
     {
         sUri = new Uri(string.Concat(this.Url, "?", sPostData)) ;
         request = (HttpWebRequest)WebRequest.Create(sUri);
         request.Method = Method; 
         request.ContentType = "text/plain";
         request.ContentLength = 0;         
     }

     HttpWebResponse response = (HttpWebResponse) request.GetResponse();

     //Überprüft den HTTP-Statuscode
     if (response.StatusCode !=  HttpStatusCode.OK)
         return "N,-1, HTTPStatuscode:" +response.StatusCode.ToString() ;

     Stream responseStream = response.GetResponseStream();
     StreamReader readStream = new StreamReader (responseStream, Encoding.UTF8);
     return readStream.ReadToEnd();
  
 }


Nur wenn die Methode POST gewählt wurde, wird ein Stream genutzt um die zu übermittelnden Daten dort unterzubringen.


Kommentar schreiben