当前位置:首页 » 《休闲阅读》 » 正文

C# HTTP POST(System.Net.WebException:请求已中止:请求已被取消)

27 人参与  2024年10月08日 16:00  分类 : 《休闲阅读》  评论

点击全文阅读


一.问题描述

最近在使用c# http post请求时,遇见了这种异常,大概异常提示如下

System.Net.WebException:请求已中止:请求已被取消,在数据写入前关闭了数据流

错误代码如下:

        /// <summary>        /// 向指定URL发送POST请求        /// </summary>        /// <param name="url">发送请求的URL</param>        /// <param name="jsonData">请求参数,请求参数应该是Json格式字符串的形式</param>        /// <param name="contenType"><设置响应信息的编码格式,如utf-8/param>        /// <param name="header">请求头</param>        /// <returns>所代表远程资源的响应结果</returns>        public static string SendPost(string url,string jsonData,Encoding encoding,string contenType="application/json",Dictionary<string,string>header=null)        {            string result =string.Empty;            try            {                CookieContainer cookie = new CookieContainer();                HttpWebRequest request= (HttpWebRequest)WebRequest.Create(url);                request.Method = "POST";                if(null != header && 0 < header.Count())                {                    foreach(var item in header.Keys)                    {                        request.Headers.Add(item, header[item]);                    }                }                request.ServicePoint.Expect100Continue = false;                request.ContentType = contenType;                request.ContentLength = Encoding.UTF8.GetByteCount(jsonData);                request.CookieContainer = cookie;                using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), encoding))                {                    writer.Write(jsonData);                }                HttpWebResponse response = (HttpWebResponse)request.GetResponse();                response.Cookies = cookie.GetCookies(response.ResponseUri);                using (Stream responseStream=response.GetResponseStream())                {                    using(StreamReader reader= new StreamReader(responseStream,encoding))                    {                        result = reader.ReadToEnd();                        reader.Close();                    }                    responseStream.Close();                }                response.Close();                response = null;                request = null;            }            catch (Exception ex)            {                string msg = ex.Message;            }            return result;        }

通过代码调试,出问题的大致位置在这里:

 using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), encoding)) {     writer.Write(jsonData); }

二.问题分析

在Write时,数据流意外关闭了,触发了http数据传输异常,为什么会出现这种情况,使用其它接口时不会出现这种问题,通过分析代码以及查阅资料发现了出问题的原因,我在调用接口函数时是这样的:

SendPost(url, jsonData, Encoding.Default, contenType, header);

这里我指定了编码格式为Encoding.Default,在函数内部计算request.ContentLength 长度的时候却指定了UTF8编码,如下:

request.ContentLength = Encoding.UTF8.GetByteCount(jsonData);

这种情况如果当前默认刚好是UTF8编码,则不会出问题,如果是其它编码,则数据流读取时会出问题(编码解析规则),导致意外结束,分析问题大概是这样

三.问题修改

修改后的代码如下,使用前后一致的编码格式

        /// <summary>        /// 向指定URL发送POST请求        /// </summary>        /// <param name="url">发送请求的URL</param>        /// <param name="jsonData">请求参数,请求参数应该是Json格式字符串的形式</param>        /// <param name="contenType"><设置响应信息的编码格式,如utf-8/param>        /// <param name="header">请求头</param>        /// <returns>所代表远程资源的响应结果</returns>        public static string SendPost(string url,string jsonData,Encoding encoding,string contenType="application/json",Dictionary<string,string>header=null)        {            string result =string.Empty;            try            {                CookieContainer cookie = new CookieContainer();                HttpWebRequest request= (HttpWebRequest)WebRequest.Create(url);                request.Method = "POST";                if(null != header && 0 < header.Count())                {                    foreach(var item in header.Keys)                    {                        request.Headers.Add(item, header[item]);                    }                }                request.ServicePoint.Expect100Continue = false;                request.ContentType = contenType;                request.ContentLength = encoding.GetByteCount(jsonData);                request.CookieContainer = cookie;                using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), encoding))                {                    writer.Write(jsonData);                }                HttpWebResponse response = (HttpWebResponse)request.GetResponse();                response.Cookies = cookie.GetCookies(response.ResponseUri);                using (Stream responseStream=response.GetResponseStream())                {                    using(StreamReader reader= new StreamReader(responseStream,encoding))                    {                        result = reader.ReadToEnd();                        reader.Close();                    }                    responseStream.Close();                }                response.Close();                response = null;                request = null;            }            catch (Exception ex)            {                string msg = ex.Message;            }            return result;        }

四.其它解决该异常的方法

这种异常问题触发原因估计有很多,这里收集一些其它的解决方法

1.添加:request.KeepAlive = false

2.注释掉:request.ContentLength = data.Length;


点击全文阅读


本文链接:http://zhangshiyu.com/post/169089.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1