Ваш catch
блок находится за пределами вашего цикла. Таким образом, каждый раз, когда происходит исключение, оно выходит из цикла. Так что вам просто нужно инвертировать ваши while
и try
, чтобы вы могли изучить Exception
(пока он находится внутри цикла) и решить, хотите ли вы повторить попытку или прервать выполнение.
public async Task Start() {
while(true) {
try {
var context = await _listener.GetContextAsync().ConfigureAwait(false);// it stays here
HandleRequest(context); // handle incoming requests
} catch (HttpListenerException e) {
// examine e.ErrorCode to see what the problem was and
// decide to continue or return
} catch (Exception e) {
// decide to continue or return
}
}
}
Документация для HttpListener.GetContext
(которая работает так же, как GetContextAsync
) гласит, что когда она выдает HttpListenerException
, это означает, что:
Ошибка вызова функции Win32. Проверьте свойство ErrorCode исключения, чтобы определить причину исключения.
По моему опыту, оно выдается только тогда, когда вы намеренно останавливаете слушателя. Но, возможно, что-то еще пошло не так. Если вы сообщите нам сообщение об исключении, мы сможем помочь вам больше.
Если оно вам поможет, я написал статью с примером кода о создании базового веб-сервиса HttpListener .