「パラメーター 'wheels' は、Edm 型の種類 'Collection' です。Edm 型の種類 'Collection' ではないパラメーターで CreateCollectionWriter を呼び出すことはできません。」というエラーが表示されます。
以下は私のセットアップの詳細です:
Web API 2.2 OData v4 サービス: サービスの WheelsController クラスに次のように Action を定義しました。
public async Task<IHttpActionResult> UpdateWheels(ODataActionParameters parameters)
{
object value;
parameters.TryGetValue("carId", out value);
int carId= (int)value;
parameters.TryGetValue("wheels", out value)
IEnumerable<Wheel> wheels = (IEnumerable<Wheel>)value;
// logic goes here....
return OK();
}
WebApiConfig.cs ファイルでは、Action 構成は次のように定義されています。
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Car>("Cars");
builder.EntitySet<Wheel>("Wheels");
var action = builder.EntityType<Wheel>().Collection.Action("UpdateWheels");
action.Parameter<int>("carId");
action.CollectionParameter<Wheel>("wheels");
上記のアクションを FireFox ブラウザの RESTClient 拡張機能から URL " http://localhost/Service/Wheels/UpdateWheels " への POST リクエストとして、リクエスト ボディとして呼び出すことに成功しました。
{"carId":2,
"wheels":[{"Id":1,"Name":"Wheel Front 1","Description":"Front wheel left", "PositionEnum":"FrontLeft"},
{"Id":2,"Name":"Wheel Front 2","Description":"Front wheel right", "PositionEnum":"FrontRight"}]
}
ただし、次のようなクライアント アプリケーションで Simple.OData.Client を使用して上記のサービス アクションを呼び出そうとすると、エラーが発生します。
public async void TestUpdateWheels(List<Wheel> wheelList)
{
// client is derived from ODataClient from assembly Simple.OData.Client.Core.dll, v4.3.0.0
await client.For<Wheel>()
.Action("UpdateWheels")
.Set(new { carId = 2, wheels = wheelList})
.ExecuteAsync();
}
エラー メッセージ: パラメータ 'wheels' は、Edm タイプの種類 'Collection' です。Edm 型の種類が 'Collection' ではないパラメーターで CreateCollectionWriter を呼び出すことはできません。
上記のアクションを ODataClient から正常に呼び出すにはどうすればよいですか?