あなたは正しいと思います。基本的な考え方は次のようになります。
/// <summary>
/// Invokation helper for Actions in the ReSTful world, this is provided since currently no methods exist to
/// do this in the Microsoft Services framework that I could find.
/// </summary>
/// <typeparam name="InType">The type of the entity to invoke the method against</typeparam>
public class InvokationHelper<InType, OutType>
{
/// <summary>
/// Invokes the action on the entity passed in.
/// </summary>
/// <param name="container">The service container</param>
/// <param name="entity">The entity to act upon</param>
/// <param name="ActionName">The name of the action to invoke</param>
/// <returns>OutType object from the action invokation</returns>
public OutType InvokeAction(Container container, InType entity, string ActionName)
{
string UriBase = container.GetEntityDescriptor(entity).SelfLink.AbsoluteUri;
string UriInvokeAction = UriBase + "/" + ActionName;
Debug.WriteLine("InvokationHelper<{0}>.InvokeAction: {1}", typeof(InType), UriInvokeAction);
try
{
IEnumerable<OutType> response;
response = container.Execute<OutType>(
new Uri(UriInvokeAction),
"POST",
true
);
return response.First();
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// Invokes the action on the entity passed in.
/// </summary>
/// <param name="container">The service container</param>
/// <param name="entity">The entity to act upon</param>
/// <param name="ActionName">The name of the action to invoke</param>
/// <returns>An enumeration of OutType object from the action invokation</returns>
public IEnumerable<OutType> InvokeActionEnumerable(Container container, InType entity, string ActionName)
{
string UriBase = container.GetEntityDescriptor(entity).SelfLink.AbsoluteUri;
string UriInvokeAction = UriBase + "/" + ActionName;
Debug.WriteLine("InvokationHelper<{0}>.InvokeAction: {1}", typeof(InType), UriInvokeAction);
try
{
IEnumerable<OutType> response;
response = container.Execute<OutType>(
new Uri(UriInvokeAction),
"POST",
true
);
return response;
}
catch (Exception e)
{
throw e;
}
}
}
}
これを行うには、もっとエレガントな方法がたくさんあると確信しています。あなたがこれの周りにコードを書いたなら、私はそれを見たいです。言語の端にある私のC#(実行時まで定義されていない型でメソッドを呼び出す一般的な方法の作成など)は最強ではありません。
呼び出しは次のようなものです。
InvokationHelper<MyObjectType, MyObjectType> helper = new InvokationHelper<MyObjectType, MyObjectType>();
try
{
MyObjectType resultObject = helper.InvokeAction(container, myServiceObject, "MyActionName");
}
catch (Exception e)
{
// Handle failure of the invokation
}
拡張型を取得するには、EntitySetControllersアクションメソッドを[FromODataUri]属性で装飾する必要があることに注意してください。これにより、渡されたキーパラメータに適切なEdm入力が適用されます。これがないと、URI行で装飾されているタイプのEdmから解析エラーが発生します。たとえば、... / EntitySet(12345L)/ ActionNameのようなURIを持つEntitySetは、解析中にエラーをスローします。名目上、目的はパラメータをEdm.Int64のタイプにデコードすることですが、これは[FromODataUri]属性がないと発生しません。
[HttpPost]
public ReturnEntityType ActionName([FromODataUri]long key)
{
...
}
これは私が狩りをするのに非常に苛立たしいバグでした、そして私はそれをバグとしてMSに提出しました。入力パラメータに必要なタイプの装飾が必要であることがわかりました。