记.NET HttpWebResponse异步获取返回数据的异常处理

 异常函数的写法:

        public static  Task<string> HttpGetAsync(string url, Dictionary<string, string> headers = null)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                if (headers != null)
                {
                    foreach (var header in headers)
                        request.Headers[header.Key] = header.Value;
                }
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    Stream responseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
                    return streamReader.ReadToEndAsync();
                }
            }
            catch (Exception ex)
            {
                return Task.FromResult(ex.Message);
            }
        }

在异步调用以上函数,使用return streamReader.ReadToEndAsync()的结果时,可能会抛出以下异常提示:

Unable to read data from the transport connection: Operation canceled.

Specified argument was out of the range of valid values.

即异步IO 中的网络流是异步输入的,在await使用该方法的返回结果时,可能会遇到流还没读取完的情况,如果此时将结果字符串进行json反序列化的使用,可能会报遇到意外终止符等异常。

优化写法:

public static  async Task<string> HttpGetAsync(string url, Dictionary<string, string> headers = null)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                if (headers != null)
                {
                    foreach (var header in headers)
                        request.Headers[header.Key] = header.Value;
                }
                var result=string.Empty;
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using(Stream responseStream = response.GetResponseStream())
                    {
                        using(StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8))
                        {
                            result = await streamReader.ReadToEndAsync();              
                            streamReader.Close();
                        }
                        responseStream.Close();
                    }        
                    response.Close();
                }
                return result;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

使用await在函数内同步获取完全结果后,依次释放对象的使用和对流进行关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值