3

ODataアクション(サービスメソッドではない)の実装について言及しているWCF DataService5.0リリースノートを読みました。

チュートリアルを分析した後、私は自分自身のためにEntityFramework用のWCFデータサービスアクションプロバイダーを構築する必要があるという結論に達しました。

そのプロジェクトにはチェックインが1つしかなく、それ以降は更新されていません。バグはないと思いますが、統計によると、経験を共有するためにあまり多くの顧客ベースを期待していません。

.NETでODataアクションを実装するための他のオプションを知っていますか?

4

2 に答える 2

2

ASP.NET Web API OData の使用を検討しましたか? OData アクションがサポートされており、Web API を使用して簡単に実装できます。詳細については、このブログ投稿を参照してください。

于 2013-01-16T19:58:11.827 に答える
1

あなたは正しいと思います。基本的な考え方は次のようになります。

/// <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に提出しました。入力パラメータに必要なタイプの装飾が必要であることがわかりました。

于 2013-03-07T09:18:57.793 に答える