Как исправить httplistener после исключения - PullRequest
0 голосов
/ 20 октября 2019

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

public class HttpServer{

 public HttpServer(string id)
    {
        try {
            _id= id;
            var prefix = $"http://localhost:39633/queries/{id}/";
            _listener = new HttpListener();
           _listener.Start();

        }
        catch (Exception e) {

        }
    }

    public async Task Start()
    {
        try {
            while(true ) {
                var context = await _listener.GetContextAsync().ConfigureAwait(false);// it stays here
                HandleRequest(context); // handle incoming requests
            }
        }
        catch (Exception e) {

        }
    }
}

Я хочу, чтобы сервер продолжал работать, есть ли способ сделать это

1 Ответ

0 голосов
/ 20 октября 2019

Ваш 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 .

...