C# 使用WebApi客户端发布复杂类型

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

我正在使用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

以下是我的控制器的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; }
    }