发生异常时的HttpWebRequest异步调用执行顺序

时间:2019-02-13 16:32:49

标签: c# exception async-await httpwebrequest

我使用HttpWebRequest异步调用Web服务,偶尔 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承诺,布尔值requireSynchronization)中
---从先前引发异常的位置开始的堆栈跟踪---
   在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)上
   在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
   在MyService.d__7.MoveNext()

我想我还没有完全理解HttpWebRequest如何在异步模式下工作。无论如何,我希望这些问题能帮助我更多地理解它:
1。为什么即使发生异常也会继续执行?以我的理解,应该只有2个日志项来记录异常。
2。发生异常“基础连接已关闭”的原因是什么?为什么会发生异常,但服务仍返回正确的结果?

1 个答案:

答案 0 :(得分:2)

  

为什么即使发生异常也会继续执行?据我了解,应该只有2个日志项来记录异常。

这是不可能的。我怀疑您的代码两次调用GetResult。日志似乎表明了这一点。

  

发生“基础连接已关闭”异常的原因是什么?

当服务器在客户端准备好关闭连接之前关闭连接时,会发生这种情况。这是从REST API获得的异常错误,但并非闻所未闻。