2

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;

2 つの呼び出しの唯一の違いは、一方が を呼び出しPostAsXmlAsync、もう一方が を呼び出していることですPostAsJsonAsync

これが私のコントローラーの署名です(私はアクションベースのルーティングを使用しています):

[HttpPost]
public void PostLoan(Loan loan)
{
    Debug.WriteLine(loan.LoanId);
}

そして、ここに私のテストモデルがあります:

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 }
4

1 に答える 1

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>

リクエストの名前空間は、アクション パラメータで使用するクラスの名前空間と一致する必要がありますDataContractSerializer

たとえば、LoanWeb API のクラスの名前空間はMyWebApiProject.MyModels. クライアント アプリケーションでは、Loanクラスの名前空間がMyWebApiProject.MyModels.

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/MyWebApiProject.MyModels")]
    public class Loan
    {
        [DataMember]
        public int LoanId { get; set; }
    }

DTO を共有する場合は、それらをプロジェクトに分けて、クライアントと Web API の両方で参照することをお勧めします。これにより、名前空間の一貫性が保たれます。

于 2013-07-13T03:01:10.317 に答える