5

私は WCF restul サービスを持っており、ユーザーが必要な要求形式を選択できるようにしたいのですが、装飾があります

    [OperationContract]
    [WebInvoke(Method = "GET", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.Wrapped, 
        UriTemplate = "getstreamurl?ch={ch}&format=xml")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "getstreamurl?ch={ch}&format=json")]

まず、実行時に ResponseFormat を指定し、メソッドの引数としてフォーマットを取得する方法はありますか? 周りを読んでいるとそうは思いません...OK次のこと上記のコードは問題なく動作しますが、問題があり、デフォルトを指定できるようにしたいので、フォーマット引数が渡されない場合はデフォルトにしますが、私はそのように飾ります

    [WebInvoke(Method = "GET", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.Wrapped, 
        UriTemplate = "getstreamurl?ch={ch})]

    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "getstreamurl?ch={ch}&format=json")]

XML がデフォルトである場合、ブラウザからサービス メソッドを呼び出そうとすると、次のように表示されます。

UriTemplateTable は、テンプレート 'getstreamurl?ch={ch}' と同等のパスを持つ複数のテンプレートをサポートしていませんが、クエリ文字列が異なる複数のテンプレートをサポートしていません。クエリ文字列はすべてリテラル値で明確にすることはできません。詳細については、UriTemplateTable のドキュメントを参照してください。

それらは明らかに区別できますが、WCFは引数までしか読み取っていないようです...何か提案はありますか?

4

2 に答える 2

6

いいえ、実行時にプログラムでそれを行うことはできないと思います。もちろん、サービスから 2 つの異なるエンドポイント (XML を返すエンドポイントと JSON を返すエンドポイント) を公開し、クライアント アプリからどちらを呼び出すかをプログラムで選択する場合にできることは何ですか。

マルク

更新: Steve Michelotti が正しく指摘しているように、JSON と XML の間のこの自動切り替えは、WCF 4.0 で実現できるようになりました。WCF 4.0 では、REST サポートが改善されており、これには、HTTP 受け入れヘッダーに基づいた、フォーマット メッセージ選択機能も含まれています。

WCF 4.0 の新機能の詳細については、次を参照してください: A Developer's Introduction to WCF 4.0

于 2009-06-17T21:08:35.970 に答える
3

残りのサービスが応答タイプを自動的に選択するように構成されている場合は、これを行うことができます。

次に、クライアントの要求に応じて、必要なヘッダー Accept: application/json を追加するだけです

于 2011-07-30T13:45:49.033 に答える