C# 使用WebApi客户端发布复杂类型
我正在使用WebApi客户端发布到WebApi测试项目。控制器上的post方法接受单个参数(模型) 如果我使用JSON发布,一切都会正常。如果使用XML发布,则参数始终为null。这是虫子吗C# 使用WebApi客户端发布复杂类型,c#,asp.net-web-api,C#,Asp.net Web Api,我正在使用WebApi客户端发布到WebApi测试项目。控制器上的post方法接受单个参数(模型) 如果我使用JSON发布,一切都会正常。如果使用XML发布,则参数始终为null。这是虫子吗 var client = new HttpClient(); // on the server side, the loan param will be null var response = client.PostAsXmlAsync( "http://localhost.fiddler:5483
var client = new HttpClient();
// on the server side, the loan param will be null
var response = client.PostAsXmlAsync(
"http://localhost.fiddler:54835/api/Loan/PostLoan",
new Loan() { LoanId = 1 }).Result;
// on the server side, the loan param is just fine
var response = client.PostAsJsonAsync(
"http://localhost.fiddler:54835/api/Loan/PostLoan",
new Loan() { LoanId = 1 }).Result;
这两个调用之间的唯一区别是,在一个调用中,我调用了PostAsXmlAsync
,在另一个调用中,我调用了PostAsJsonAsync
以下是我的控制器的sig(我使用基于动作的路由):
这是我的测试模型:
public class Loan
{
public int LoanId { get; set; }
}
以下是我的路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "get", id = RouteParameter.Optional }
我猜您在Web API和客户端应用程序中使用的是不同的类。如果查看请求XML,您将看到这样一个名称空间。我只是用
MyNamespace
来说明
<Loan xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/MyNamespace">
<LoanId>1</LoanId>
</Loan>
如果您想共享DTO,最好将它们分离到一个项目中,并在客户端和Web API中引用它们,这样您就可以在名称空间中保持一致性。这是一个很好的猜测,这是一个很好的错误!当我使用WCF时,我知道得更好,但是我没有想到WebAPI在覆盖下使用DATACONTRORE序列化器,所以当然命名空间很重要!谢谢
<Loan xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/MyNamespace">
<LoanId>1</LoanId>
</Loan>
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/MyWebApiProject.MyModels")]
public class Loan
{
[DataMember]
public int LoanId { get; set; }
}