2011-08-10 12 views
8

Pracuję nad projektem, który będzie odbierać HTTP POST zawierające dane XML. Mam zamiar skonfigurować HttpListener do odbierania HTTP POST, a następnie odpowiedzi z ACK.jak używać HttpListener do odbierania Poczty HTTP zawierającej XML

Zastanawiam się, czy istnieją przykłady implementujące podobną funkcjonalność? I ile żądań może obsługiwać HttpListener w tym samym czasie?

Będę mieć kolejkę komunikatów do przechowywania żądań od klienta. I będę musiał skonfigurować klienta testowego, aby wysłać żądanie do HttpListener w celach testowych. Czy powinienem skonfigurować WebRequest lub coś innego do przetestowania HttpListener?

Odpowiedz

11

Możesz użyć HttpListener do przetwarzania przychodzących HTTP POST, możesz prawie wykonać dowolny samouczek, który znajdziesz dla słuchacza. Oto jak ja to robię (uwaga to synchronicznych, aby obsługiwać więcej niż 1 wniosek na raz, będziesz chciał używać wątków lub przynajmniej metody async.)

public void RunServer() 
{ 
    var prefix = "http://*:4333/"; 
    HttpListener listener = new HttpListener(); 
    listener.Prefixes.Add(prefix); 
    try 
    { 
     listener.Start(); 
    } 
    catch (HttpListenerException hlex) 
    { 
     return; 
    } 
    while (listener.IsListening) 
    { 
     var context = listener.GetContext(); 
     ProcessRequest(context); 
    } 
    listener.Close(); 
} 

private void ProcessRequest(HttpListenerContext context) 
{ 
    // Get the data from the HTTP stream 
    var body = new StreamReader(context.Request.InputStream).ReadToEnd(); 

    byte[] b = Encoding.UTF8.GetBytes("ACK"); 
    context.Response.StatusCode = 200; 
    context.Response.KeepAlive = false; 
    context.Response.ContentLength64 = b.Length; 

    var output = context.Response.OutputStream; 
    output.Write(b, 0, b.Length); 
    context.Response.Close(); 
} 

Główną część, która trafia XML z żądania to linia:

var body = new StreamReader(context.Request.InputStream).ReadToEnd(); 

Daje to treść żądania HTTP, które powinno zawierać Twój XML. Prawdopodobnie możesz przesłać go bezpośrednio do dowolnej biblioteki XML, która może czytać ze strumienia, ale pamiętaj, aby zwrócić uwagę na wyjątki, jeśli na serwer zostanie wysłane również bezpańskie żądanie HTTP.