如何让C#编写的API接收XML而非URL参数?
解决ASP.NET Web API接收XML请求体参数为空的问题
你的问题根源在于:Web API默认会将int、bool这类简单类型参数从URL查询字符串中绑定,而不是从请求体读取。所以即使你发送了XML请求体,方法里的参数也不会被正确赋值。需要从代码调整和Postman请求设置两方面入手解决:
一、代码层面调整
1. 创建对应XML结构的模型类
首先需要定义一个与XML数据结构匹配的实体类,用来接收请求体中的XML数据。这里分两种序列化方式的写法:
方式一:使用XmlSerializer(匹配自定义标签名)
如果想保留你原来的<response>根标签和小写子标签,可以给模型类添加XML序列化特性:
using System.Xml.Serialization; [XmlRoot("response")] public class SendEmailRequest { [XmlElement("orderID")] public int OrderID { get; set; } [XmlElement("internalUse")] public bool InternalUse { get; set; } [XmlElement("subject")] public string Subject { get; set; } [XmlElement("message")] public string Message { get; set; } }
方式二:使用DataContractSerializer(默认序列化方式)
如果用Web API默认的DataContractSerializer,需要添加数据契约特性:
using System.Runtime.Serialization; [DataContract(Name = "response")] public class SendEmailRequest { [DataMember(Name = "orderID")] public int OrderID { get; set; } [DataMember(Name = "internalUse")] public bool InternalUse { get; set; } [DataMember(Name = "subject")] public string Subject { get; set; } [DataMember(Name = "message")] public string Message { get; set; } }
2. 修改API方法参数
将原来的四个独立参数替换为上面创建的模型类,并通过[FromBody]明确指定从请求体读取数据(复杂类型默认也会从请求体绑定,但加上特性更清晰):
public string Post([FromBody] SendEmailRequest request) { if (request == null) { return "请求体为空,请检查XML格式"; } return $"orderID: {request.OrderID}; internalUse: {request.InternalUse}; subject: {request.Subject}; message: {request.Message}"; }
3. 确保XML格式化器启用
默认情况下ASP.NET Web API已经包含XML格式化器,但如果你的项目配置中被移除,可以在WebApiConfig.cs的Register方法中添加以下代码:
public static void Register(HttpConfiguration config) { // 启用XmlSerializer(如果用方式一的话) config.Formatters.XmlFormatter.UseXmlSerializer = true; // 添加XML格式化器(确保存在) config.Formatters.Add(new System.Net.Http.Formatting.XmlMediaTypeFormatter()); // 其他路由配置... }
二、Postman请求设置调整
这一步非常关键,必须确保请求头和请求体的配置正确:
- 请求方法:保持POST
- 请求URL:
http://localhost:58069/api/values/SendEmail - 请求头:添加
Content-Type: application/xml,告诉Web API请求体是XML格式 - 请求体:选择
raw格式,然后在下拉菜单中选XML,输入你的XML内容(和模型类匹配的版本):
<?xml version="1.0" encoding="utf-8" ?> <response> <orderID>1234</orderID> <internalUse>true</internalUse> <subject>Hello</subject> <message>Hello World</message> </response>
完成以上调整后,重新调用API,参数就能被正确绑定了。
内容的提问来源于stack exchange,提问作者boilers222
相关产品推荐
相关产品推荐

