HTTP-сервер C# — Отвечает на запрос post без обработки данных post

#c# #http #post #server #get

Вопрос:

В настоящее время я работаю на локальном http-сервере, написанном на C#. На данный момент я еще не обрабатываю данные post, а только различаю запрос get и post. В обоих случаях, конечно, следует ответить на 200. Во время тестирования сервера я заметил, что если я отправляю пустой запрос post, сервер отвечает на него 200 и html-страницей, как на запрос get, без каких-либо проблем. Однако, если к почтовому запросу прикреплены изображения, как в моем примере, подключение к серверу немедленно прерывается.

Я обрабатываю клиентское соединение следующим образом. Я знаю, что не идеально хранить полученные байты в строке, но в целях тестирования я не видел с этим никаких проблем.

 private void HandleClient(TcpClient client)
{
    Byte[] bytes;
    String requestData = "";
    NetworkStream ns = client.GetStream();
    if (client.ReceiveBufferSize > 0)
    {
        bytes = new byte[client.ReceiveBufferSize];
        ns.Read(bytes, 0, client.ReceiveBufferSize);
        requestData = Encoding.ASCII.GetString(bytes);
    }

    // Get Request out of message
    Request request = Request.GetRequest(requestData);
    // Create Response
    Response response = Response.From(request);
    response.Post(client.GetStream());           
}
 

И вот метод, который я использую, чтобы определить, какой это тип запроса.

 public static Request GetRequest(String request)
{
    //return if request is null
    if(String.IsNullOrEmpty(request))
    {
        return null;
    }
    //Split Request to get tokens - split by spaces
    String[] tokens = request.Split(' ');
    String type = tokens[0];
    String url = tokens[1];
    String host = tokens[4];

    return new Request(type, url, host);
}
 

Конечно, должна быть возможность читать только заголовки из запроса get, а также запроса post, а затем все равно давать ответ 200. Существует ли правило поведения для http-сервера о том, как он должен обрабатывать данные после запроса?

Комментарии:

1. Прикрепленные изображения должны быть вложениями mime, которые начинаются со строки с двумя черточками в начале. См.: docs.microsoft.com/en-us/previous-versions/office/developer/…

2. Это так, но мой вопрос заключается в том, можно ли вообще не читать прикрепленные данные и немедленно возвращать ответ

3. HTTP-сообщение отправляется одним куском, и серверу приходится ждать, пока все сообщение не будет отправлено через Интернет и сохранено в памяти сервера. Вам не нужно читать текст, чтобы отправить ответ обратно клиенту. Чтение в потоке памяти происходит очень быстро, но использует дополнительную память и может быть медленным, если у вас заканчивается память. Что замедляет чтение, так это если вы пытаетесь записать в файл. У вас есть контроллер, и вы хотите отправить ответ до десериализации полученных данных, а не ждать, пока вы десериализуетесь.

Ответ №1:

В конце концов, ответ на мой вопрос был довольно простым. Входной поток запроса должен быть полностью прочитан, прежде чем сервер сможет ответить на запрос. В моем случае это было так, что я читал только заголовок запроса, чтобы узнать, является ли это запросом Post или Get, поэтому сервер не мог ответить на запрос в случае прикрепленного изображения, потому что входной поток не был прочитан полностью.