HttpWebRequest порядок выполнения асинхронных вызовов при возникновении исключения - PullRequest
0 голосов
/ 13 февраля 2019

Я использовал HttpWebRequest для асинхронного вызова веб-службы, иногда EndGetResponse () возвращает некоторые исключения.Тем не менее, даже я получил исключение, вызов успешен, и данные возвращаются.Ниже приведен мой код с удаленным кодом проверки ошибок.Я получил 4 элемента журнала, и заказ выглядит так:

Возвращается следующий результат: ...GetResult успешен!PostXML исключение: ...Исключение GetResult: ...

    public async Task<string> GetResult(string xmlData)
    {
        try
        {
            string response = await PostXML(Url, xmlData).ConfigureAwait(false);
            _logger.Log($"GetResult is successful!");
            return response;
        }
        catch (Exception ex)
        {
            _logger.Log("GetResult exception: " + ex.ToString());
            throw;
        }
    }

    private async Task<string> PostXML(string destinationUrl, string requestXml)
    {
        try
        {
            byte[] bytes = System.Text.Encoding.ASCII.GetBytes(requestXml);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse)await Task.Factory
                .FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream responseStream = response.GetResponseStream();
                string responseStr = new StreamReader(responseStream).ReadToEnd();
                _logger.Log("The following result is returned: \r\n" + responseStr);
                responseStream.Close();
                return responseStr;
            }
        }
        catch (Exception ex)
        {
            _logger.Log("PostXML exception: " + ex.ToString());
            throw;
        }
        return null;
    }

Исключение таково:PostXML () исключение: System.Net.WebException: базовое соединение было закрыто: соединение, которое, как предполагалось, будет сохранено живым, было закрыто сервером.в System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)в System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction, действие 1 endAction, Task 1 обещание, логическое значение требует синхронизации)--- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение ---в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача)в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача)at MyService.d__7.MoveNext ()

Полагаю, я не до конца понял, как HttpWebRequest работает в асинхронном режиме.В любом случае, я надеюсь, что эти вопросы помогут мне понять это больше:1. Почему выполнение продолжается даже при возникновении исключения?В моем понимании должно быть только 2 элемента журнала, чтобы зарегистрировать исключение.2. По какой причине возникает исключение «Базовое соединение было закрыто»?Почему возникает исключение, но служба все еще возвращает правильный результат?

1 Ответ

0 голосов
/ 13 февраля 2019

Почему выполнение продолжается даже при возникновении исключения?В моем понимании, должно быть только 2 элемента журнала, чтобы зарегистрировать исключение.

Это невозможно.Я подозреваю, что ваш код вызывает GetResult дважды.Вот что, по-видимому, указывает журнал.

По какой причине возникает исключение «Базовое соединение было закрыто»?

Это происходит, когда сервер закрывает соединение до того, какклиент готов к его закрытию.Это необычная ошибка, получаемая от REST API, но не случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...