2013-06-08 25 views
8

Potrzebuję nasłuchiwać i przetwarzać ciąg znaków POST HTTP w procedurze obsługi HTTP.Odbieranie HTTP POST w procedurze obsługi HTTP?

Poniżej znajduje się kod do wysyłania ciąg do obsługi -

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); 

Co próbowałem w Handler jest -

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

Ale jego wartość null. Jak mogę odsłuchiwać i uzyskać wartości parametrów w programie Handler?

Odpowiedz

23

Nie wydaje się przy użyciu dowolnego standardowego kodowania żądanie, zamiast tego wydają się być wymyślania jakiś protokół niestandardowy, więc nie można polegać na serwer ASP.NET, aby móc przeanalizować to żądanie. Będziesz musiał odczytać wartości bezpośrednio z InputStream:

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(); 
    } 
} 

Jeśli natomiast używasz jakiś standard kodowania żądania takiego jak application/x-www-form-urlencoded będzie w stanie odczytać parametry jak zwykle.

Oto jak taki wniosek ładowność może wyglądać następująco:

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 

Aby wysłać taki wniosek można użyć WebClient:

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

Teraz na serwerze można odczytać wartości w ten sposób:

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

Wielkie dzięki! Używam AngularJS do funkcji zmiany rozmiaru obrazu front-end, a następnie przesyłam partię (tablicę) obiektów JSON (zawierającą nazwę, wymiary, same dane obrazu (base64) itd.) Na serwer. Mam problemy z odczytywaniem ładunku (jeśli dodawanie params, "dane:" nie można znaleźć/odczytywać serveride (lub dobrze, nie wiedziałem jak).) Używanie streamReadera teraz działa dobrze :) DZIĘKUJĘ TY:) – LittleTiger

+0

@Darin Czy myślisz, że możesz mi pomóc w tym zadaniu http://goo.gl/qiOdmT – Axel

2

Zmień

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

do

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

Nadal jest pusty. – Sandy

3

To w rzeczywistości:

context.Request.Params["param1"];