Мне нужно реализовать простой 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 и быть уверены, что запрос выполнен?