Закройте HttpListener только после завершения ответа - PullRequest
0 голосов
/ 16 июня 2020

Мне нужно реализовать простой HTTP-сервер, используя HttpListener , который перенаправляет браузер в другой Интернет (после посещения http://127.0.0.1:8080), а затем самозакрывается (после успешного ответа). Я реализовал это следующим образом:

var httpListener = new HttpListener();
try 
{
  httpListener.Prefixes.Add("http://127.0.0.1:8080/");
  httpListener.Start();

  var context = await httpListener.GetContextAsync();  
  context.Response.Redirect("https://stackoverflow.com/");
  context.Response.Close();
}
catch (Exception ex)
{
  // ...
}
finally 
{
  httpListener?.Close();
}

, но он работает не очень надежно - примерно в 50% случаев мой браузер выдает «ERR_CONNECTION_REFUSED». Кажется, что httpListener.Close() вызывается до завершения запроса, поэтому браузер теряет соединение при получении данных HTTP. Я не нашел способа / обратного вызова, чтобы получить уведомление о выполнении запроса, поэтому я могу безопасно закрыть слушателя. В итоге я нашел обходной путь, добавив await Task.Delay(1000); перед закрытием HTTP-прослушивателя, который работает нормально, и мой браузер всегда перенаправляется:

var httpListener = new HttpListener();
try 
{
  httpListener.Prefixes.Add("http://127.0.0.1:8080/");
  httpListener.Start();

  var context = await httpListener.GetContextAsync();  
  context.Response.Redirect("https://stackoverflow.com/");
  context.Response.Close();

  await Task.Delay(1000); // Ugly workaround 
}
catch (Exception ex)
{
  // ...
}
finally 
{
  httpListener?.Close();
}

Есть ли более элегантный способ автоматически закрыть HttpListener и быть уверены, что запрос выполнен?

...