0

モバイルクライアントを備えたWCFRESTサービスを作成しています。
モバイルクライアントは、OAuthに沿った「authToken」を使用してユーザーのIDを表します。
authTokenは文字列パラメーターであり、現時点では、サービス内の(ほぼ)すべてのメソッドに渡されます。

私がやりたいのは、MVC ActionFilterに似たものを書くことです-これはすべてのメソッドに対して実行され、authToken処理を実行します:トークンを検証し、関連するアカウントをルックアップし、Accountインスタンスオブジェクトを返します-ルックアップが失敗すると、エラーが返されます私のメソッドも呼び出されません。

私がやりたいことと似ているこれらの 2つの質問を見つけましたが、トリッキーな部分はどういうわけかアカウントインスタンスを導入しているように見えますか?IOperationBehaviorインターフェイスを実装する[AuthOperation]属性を非常にうまく作成できますが、調べた新しいアカウントインスタンスを導入するために何をする必要があるかを理解できません。

        public object Invoke(object instance, object[] inputs, out object[] outputs)
    {
        Account = new Account(_context);
        if (!Account.LoadByAuthToken(((string)inputs[0]).FromEncodedString()))
        {
            outputs = new object[0];
            return new ErrorResponse
                    {
                        Code = ResponseCode.Exception.ToString(),
                        DebugMessage = MyStrings.AuthToken_NotFound
                    };
        }

Accountインスタンスを呼び出されたメソッドに渡すにはどうすればよいですか?

        object result = this._originalInvoker.Invoke(instance, IntroduceAccount(inputs,Account), out outputs); 
        return result;
    }

最終的に私が欲しいのは持っていることです

public MyResponse GetContacts(string authToken)

サービスで公開されていますが

public MyResponse GetContacts(Account acct)

また

public MyResponse GetContacts(Account acct, string authToken)

実際にサーバーに実装され、authToken->アカウント変換が「アクションフィルター」によって処理されます。

答えが「WCFを使用しないで、このようにしてください...」である場合でも、他に提案されているものが他の要件にも適合する限り、私は幸せです。

4

2 に答える 2

1

傍受の使用を検討しましたか?この例を見てください。そこに他のインターセプターの実装があります。このリンクには、さらにいくつかのオプションがあります。

于 2012-04-20T17:03:12.140 に答える
0

私は本当に馬鹿で、(ほとんど)私の目標を達成することは実際にはかなり簡単でした。

上記の(Invoke)メソッドでは、呼び出されているインスタンスにアクセスできます。

        var wcfAccountRequired = instance as IWcfAccountRequired;
        if (wcfAccountRequired != null)
        {
            (wcfAccountRequired).Account = Account;
        }

...特定のインターフェースが(インスタンス)によって実装されていることを確認し、それにAccountプロパティを割り当てます。アカウントを正常に取得できなかった場合は、エラーを返すだけで、何も呼び出さないでください。

完璧ではありませんが、私の問題を簡潔に解決します。

于 2012-04-30T08:17:02.730 に答える