0

私は次のASP.NETWebAPIバインディングを持っています:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new {id = RouteParameter.Optional}
    );

そして、私のコントローラーは次のようになります。

public class ReferenceDataController : BaseController
{
    [RequireUserToken(ApprovedDeviceToken = true, ValidUserToken = true)]
    [HttpPost]
    public IEnumerable<SynchronizeItem<IReferenceDataItem>> Sync([FromBody]IEnumerable<SynchronizeItem<IReferenceDataItem>> clientSyncItems, [FromUri]int referenceDataType)
    {
        // my code
    }

クライアントサイトでは、次のコードを使用してリクエストを送信します。

var client = new RestClient (baseUrl);
var request = new RestRequest (resource, method);
request.XmlSerializer = new JsonSerializer ();
request.RequestFormat = DataFormat.Json;
request.AddHeader ("X-Abc-DeviceToken", deviceToken);

if (!string.IsNullOrWhiteSpace (userToken))
    request.AddHeader ("X-Abc-UserToken", userToken);

if (payload != null)
    request.AddBody (payload);

if (parameters != null) 
{
    foreach (var parameter in parameters)
    {
        request.AddUrlSegment(parameter.Key, parameter.Value);
    }
}

var response = client.Execute<T> (request);

http://myhost/api/referencedata/sync?referencedatatype=countries私の期待は、 IEnumerableを含む本文を使用してPOSTリクエストをに送信することです。クライアントサイトのUrlSegmentパラメーターとWebサービスサイトの2番目の引数を削除すると、機能します。

本文をペイロードおよび追加のURLパラメーターと組み合わせるにはどうすればよいですか?

4

1 に答える 1

1

アクションメソッドは次のように定義できます。

[RequireUserToken(ApprovedDeviceToken = true, ValidUserToken = true)]
[HttpPost]
public IEnumerable<SynchronizeItem<IReferenceDataItem>> Sync(IEnumerable<SynchronizeItem<IReferenceDataItem>> clientSyncItems, int referenceDataType)
{
    // my code
}

BodyAttributeまたはFromUriAttributeはありません。このようにして、Web APIはMediaTypeFormatterを使用して、本文をclientSyncItemsコレクションとクエリ文字列からの追加の値型(クエリ文字列からのreferenceDataType)に逆シリアル化しようとします。定義したルートは、Idとして「sync」を取ります(アクションのパラメーターではないため、無視されます)。

また、Web APIが適切なフォーマッター(jsonやxmlなど)を選択できるように、content-typeヘッダーを指定する必要があります。

于 2013-03-26T12:53:31.110 に答える