使用WebApi Client发布复杂类型

时间:2013-07-12 22:31:15

标签: 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: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 }

1 个答案:

答案 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中引用它们,这样你就可以在名称空间中保持一致。