2013-06-08 12 views
8

Ich muss zuhören und eine HTTP-POST-Zeichenfolge in einem HTTP-Handler verarbeiten.Empfangen eines HTTP-POST im HTTP-Handler?

Unten ist der Code für die Zeichenfolge-Handler Posting -

string test = "charset = UTF-8 & param1 = val1 & param2 = val2 & param3 = val3 & param4 = val4; 
byte[] data = Encoding.UTF8.GetBytes(test); 
PostData("http://localhost:53117/Handler.ashx", data); 

Was ich in Handler versucht ist -

public void ProcessRequest(HttpContext context) 
    { 
     var value1 = context.Request["param1"]; 
    } 

Aber sein null. Wie kann ich die Parameterwerte in Handler abhören und abrufen?

Antwort

23

Sie scheinen nicht alle Standardanforderung Kodierungen verwenden, stattdessen scheinen Sie einige benutzerdefinierte Protokoll zu neu zu erfinden, so kann man nicht vertrauen der Server ASP.NET, um diese Anfrage analysieren zu können. Sie werden die Werte direkt aus dem Inputstream lesen müssen:

public void ProcessRequest(HttpContext context) 
{ 
    using (var reader = new StreamReader(context.Request.InputStream)) 
    { 
     // This will equal to "charset = UTF-8 & param1 = val1 & param2 = val2 & param3 = val3 & param4 = val4" 
     string values = reader.ReadToEnd(); 
    } 
} 

Wenn auf der anderen Seite Sie einige Standard-Anfrage-Codierung verwenden, wie application/x-www-form-urlencoded Sie die Parameter wie gewohnt lesen können.

Hier ist, wie eine solche Anfrage Nutzlast aussehen könnte:

POST /Handler.ashx HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 47 
Connection: close 

param1=val1&param2=val2&param3=val3&param4=val4 

Um eine solche Anfrage senden Sie eine WebClient verwenden:

using (var client = new WebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "param1", "value1" }, 
     { "param2", "value2" }, 
     { "param3", "value3" }, 
     { "param4", "value4" }, 
    }; 
    byte[] result = client.UploadValues(values); 
} 

nun auf dem Server, um die Werte lesen wie folgt aus:

public void ProcessRequest(HttpContext context) 
{ 
    var value1 = context.Request["param1"]; 
    var value2 = context.Request["param2"]; 
    ... 
} 
+0

Vielen Dank! Ich verwende AngularJS als Front-End-Funktion zur Bildgrößenanpassung und lade dann einen Stapel (Array) von JSON-Objekten (mit Namen, Abmessungen, Bilddaten selbst (base64) usw.) auf den Server hoch. Ich hatte Probleme beim Lesen der Payload (beim Hinzufügen von Parametern konnte das "data:" nicht gefunden/gelesen werden serverseitig (oder naja, wusste nicht wie).) Also mit dem StreamReader funktioniert es jetzt gut :) DANKE SIE :) – LittleTiger

+0

@Darin Bitte denken Sie, dass Sie mir mit dieser Frage http://goo.gl/qiOdmT helfen könnten – Axel

2

ändern

var value1 = context.Request["param1"]; 

zu

var value1 = context.Request.Form["param1"]; 
+0

Noch seine Null. – Sandy

3

Es ist eigentlich:

context.Request.Params["param1"];