#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, поэтому сервер не мог ответить на запрос в случае прикрепленного изображения, потому что входной поток не был прочитан полностью.