我正在使用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: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。
这是我的控制器的信号(我正在使用基于行动的路由)
[HttpPost]
public void PostLoan(Loan loan)
{
Debug.WriteLine(loan.LoanId);
}
// and here's my test model:
public class Loan
{
public int LoanId {get;set;}
}
// and here's my routing:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "get", id = RouteParameter.Optional }
答案 0 :(得分:3)
我的猜测是你在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>
请求中的命名空间必须与您在action参数中使用的类匹配,以使DataContractSerializer
起作用。
说,Web API中的Loan
类的名称空间为MyWebApiProject.MyModels
。在客户端应用程序中,如果Loan
类的命名空间不是MyWebApiProject.MyModels
,则[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/MyWebApiProject.MyModels")]
public class Loan
{
[DataMember]
public int LoanId { get; set; }
}
类必须如此。
{{1}}
如果你想共享DTO,最好将它们分成一个项目并在客户端和Web API中引用它们,这样你就可以在名称空间中保持一致。