3

「パラメーター '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 から正常に呼び出すにはどうすればよいですか?

4

2 に答える 2

1

プロジェクト サイトに報告したところ、これは Simple.OData.Client バージョン 4.3.0 のバグであることが判明しました。詳細については、 https://github.com/object/Simple.OData.Client/issues/117のリンクにアクセスしてください。

Simple.OData.Client の新しいバグ修正バージョン 4.7.2 により、問題が修正されました。

于 2015-06-16T08:31:51.207 に答える
0

この方法で試してみてください。それは私のプロジェクトの1つで私のために働きます。

public async Task<string> TestUpdateWheels(List<Wheel> wheelList)
{
    string getRules = await client.ExecuteActionAsScalarAsync<string>
     ("UpdateWheels", new Dictionary<string, object>
        {
           { "YourParamater", wheelList}

        });
   return getRules ;
}
于 2015-06-15T09:42:34.277 に答える