C# POST XML(修正中文乱码问题)

本文介绍了一个使用C#发送XML数据到指定URL的示例代码,详细展示了如何构造HTTP POST请求,包括设置请求头、发送XML内容及处理响应等步骤。

        #region 发送xml文件给指定网址
        /// <summary>
        /// 发送xml文件给指定网址
        /// </summary>
        /// <param name="v_strURL">目标Url</param>
        /// <param name="v_objXMLDoc">需要发送的数据(XmlDocument格式的)</param>
        /// <returns>服务器响应</returns>
        public static XmlDocument PostXMLTransaction(string v_strURL, XmlDocument v_objXMLDoc)
        {
            //set max enough to avoid http request is used out -> avoid dead while get response
            ServicePointManager.DefaultConnectionLimit = 200;
            XmlDocument XmlResponse = null;
            HttpWebRequest req;
            HttpWebResponse rep = null;
            Stream reqStream = null;
            //创建一个流对象(用来读取响应对象的内容)
            Stream repStream = null;
            XmlTextReader objXmlReader;
            //垃圾回收
            System.GC.Collect();
            req = (HttpWebRequest)WebRequest.Create(v_strURL);
            try
            {
                # region Start HttpRequest
                byte[] bytes;
                //传递的值
                bytes = Encoding.UTF8.GetBytes(v_objXMLDoc.InnerXml);
                //传递的方法,必须要写,而已Get必须大写。
                req.Method = "POST";
                req.ContentLength = bytes.Length;
                //表头的格式必须要写,否则请求响应的页面得不到要传递的值
                req.ContentType = "text/xml;encoding='utf-8'";
                //把传递的值写到流中
                reqStream = req.GetRequestStream();
                reqStream.Write(bytes,0,bytes.Length);
                //必须要关闭请求
                reqStream.Close();
                #endregion End HttpRequest
                //创建一个响应对象,并从请求对象中得到响应对象的事例。
                rep = (HttpWebResponse)req.GetResponse();//此时程序才开始向目标网页发送Post请求  
                //rep = req.GetResponse() as HttpWebResponse;
                #region Start HttpResponse 
                //HttpStatusCode.OK,指示请求成功,且请求的信息包含在响应中
                if (rep.StatusCode == HttpStatusCode.OK)
                {
                    //得到回应过来的流
                    repStream = rep.GetResponseStream();
                    //Load response stream into XMLReader
                    objXmlReader = new XmlTextReader(repStream);
                    XmlDocument xmldoc = new XmlDocument();
                    xmldoc.Load(objXmlReader);
                    XmlResponse = xmldoc;
                    objXmlReader.Close();
                }
                //响应关闭,要不会占用网络资源
                rep.Close();
                #endregion
            }
            catch (WebException we)
            {
               //异常处理
            }
            catch (Exception ex)
            {
                //异常处理
            }
            finally
            {
                //关闭连接
                reqStream.Close();
                repStream.Close();
                rep.Close();
                //释放对象
                objXmlReader = null;
                reqStream = null;
                repStream = null;
                rep = null;
                //objHttpWebRequest = null;
                if (req!= null)
                {
                    req.Abort();
                }
            }
            return XmlResponse;
        }
        #endregion

小注:
1、 Content-Type:很多时候无法解析就是Content-Type的问题。如果本身就是xml文件,请跳过这一步
动态生成的XML一定要将其设置为text/xml,否则默认就是text/html也就是普通的文本了。
2、 HttpWebRequest在初始化的时候要先根据url进行创建,然后再设置Method和ContentType,然后再将请求的内容写进去,通过GetRequestStream来返回流,再向这个流中写请求内容便可以了。再通过request对象的GetResponse方法返回response对象,最后得到返回的数据流,这是通过GetResponseStream方法返回的,最后从这个流中读出返回的数据便ok了。
3、ServicePointManager .DefaultConnectionLimit Property:Gets or sets the maximum number of concurrent connections allowed by a ServicePoint object.
<think> 我们参考了用户提供的引用,特别是引用[2]和引用[4]中关于C#使用HTTP POST请求传递XML参数的方法。 引用[2]展示了使用HttpClient类发送XML数据,引用[4]则展示了另一种方法(使用自定义的Http方法)发送XML数据。 根据用户需求,我们主要关注如何用C#实现HTTP POST请求传递XML参数。 我们将提供两种常用的方法: 1. 使用HttpClient类(推荐,因为HttpClient是.NET中用于HTTP请求的现代API) 2. 使用HttpWebRequest类(较传统,但在某些情况下仍需使用) 注意:在实际开发中,建议使用HttpClient,因为它更简洁且支持异步操作。 方法一:使用HttpClient发送XML参数 步骤: a. 将对象序列化为XML字符串(可使用XmlSerializer或其他XML序列化工具) b. 创建StringContent,设置内容类型为"application/xml" c. 使用HttpClient的PostAsync方法发送请求 d. 处理响应 方法二:使用HttpWebRequest发送XML参数 步骤: a. 创建HttpWebRequest对象,设置方法和内容类型 b. 将XML字符串转换为字节数组 c. 写入请求流 d. 获取响应并读取响应流 下面分别给出代码示例。 </think> 在C#中实现HTTP POST请求传递XML参数的核心方法是使用`HttpClient`或`HttpWebRequest`类处理XML序列化和请求设置。以下是具体实现方案及注意事项: ### ✅ 方法1:使用HttpClient(推荐.NET 4.5+) ```csharp using System.Net.Http; using System.Text; public static async Task<string> PostXmlAsync(string url, object data) { // 序列化对象为XML字符串 string xmlData = XmlHelper.Serialize(data); // 创建HTTP内容(指定XML类型和编码) using (var content = new StringContent(xmlData, Encoding.UTF8, "application/xml")) using (var client = new HttpClient()) { // 发送POST请求 HttpResponseMessage response = await client.PostAsync(url, content); // 验证响应状态 if (!response.IsSuccessStatusCode) throw new HttpRequestException($"请求失败: {response.StatusCode}"); // 读取响应内容(自动处理编码) return await response.Content.ReadAsStringAsync(); } } ``` ### ✅ 方法2:使用HttpWebRequest(兼容旧版本.NET) ```csharp public static string PostXml(string url, object data) { // 序列化对象为XML字节流 byte[] xmlBytes = Encoding.UTF8.GetBytes(XmlHelper.Serialize(data)); var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/xml; charset=utf-8"; // 关键头信息 request.ContentLength = xmlBytes.Length; // 写入请求体 using (var stream = request.GetRequestStream()) { stream.Write(xmlBytes, 0, xmlBytes.Length); } // 获取响应 using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } ``` ### 📌 关键注意事项 1. **XML序列化** 使用`System.Xml.Serialization`: ```csharp public static class XmlHelper { public static string Serialize<T>(T obj) { var serializer = new XmlSerializer(typeof(T)); using (var writer = new StringWriter()) { serializer.Serialize(writer, obj); return writer.ToString(); } } } ``` 2. **字符编码一致性** - 请求头`Content-Type`必须包含`charset=utf-8` - 序列化与传输使用相同编码(推荐UTF-8) 3. **服务器端验证** 确保Web API配置XML解析(ASP.NET Core示例): ```csharp [ApiController] public class DataController : ControllerBase { [HttpPost] public IActionResult Process([FromBody] XmlElement xmlData) { // 处理XML节点 } } ``` > ⚠️ **常见问题** > - 若服务器返回`400 Bad Request`:检查XML格式有效性(可通过[XML验证工具](https://xmlvalidator.org/)) > - 若返回乱码:确认请求/响应字符集一致性 > - 性能优化:复用`HttpClient`实例(避免socket耗尽问题) ### 🌰 使用示例 ```csharp // 定义数据模型 public class Patient { public string Name { get; set; } public int Age { get; set; } } // 发送请求 var patient = new Patient { Name = "张三", Age = 30 }; string result = await PostXmlAsync("https://api.example.com/patients", patient); ``` --- ### 💡 相关问题 1. **如何防止XML序列化时的XXE攻击?** [参考:OWASP XXE防御指南](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html) *提示:禁用DTD解析* 2. **在使用HttpClient时如何设置超时和重试策略?** *涉及:Polly库的熔断机制与超时配置* 3. **如何用JSON替代XML实现相同功能的POST请求?** *对比:Content-Type改为`application/json`,使用JsonSerializer* 4. **在微服务场景下,HTTP POST与gRPC的性能差异有多大?** *关键因素:二进制编码vs文本编码,HTTP/2多路复用*
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值