Как использовать HttpListener для получения HTTP Post, который содержит XML - PullRequest
9 голосов
/ 10 августа 2011

Я работаю над проектом, который получит HTTP POST, которые содержат данные XML. Я собираюсь настроить HttpListener для получения HTTP POST, а затем ответить ACK.

Мне интересно, есть ли примеры, которые реализуют подобную функциональность? И сколько запросов может обработать HttpListener одновременно?

У меня будет очередь сообщений для хранения запросов от клиента. И мне придется настроить тестовый клиент для отправки запроса в HttpListener для целей тестирования. Должен ли я настроить WebRequest или что-то еще для тестирования HttpListener?

1 Ответ

18 голосов
/ 17 октября 2011

Вы можете использовать HttpListener для обработки входящих HTTP POST, вы можете в значительной степени следовать любому учебнику, который найдете для слушателя. Вот как я это делаю (обратите внимание, что это синхронно, для обработки более 1 запроса за раз, вы захотите использовать потоки или, по крайней мере, асинхронные методы.)

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

Основная часть, которая получает XML из запроса, - это строка:

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

Это даст вам тело HTTP-запроса, которое должно содержать ваш XML. Возможно, вы могли бы отправить его прямо в любую XML-библиотеку, которая может читать из потока, но обязательно следите за исключениями, если на ваш сервер также отправляется случайный HTTP-запрос.

...