0

VS2010、.NET 4 に WCF プロジェクトがあります。サービス呼び出しで複数のシームレスなフォーマッターをサポートするために、WcfRestContrib を使用しています。これは機能していません。JSON ペイロードを使用してクエリを送信できますが、応答で JSON データを自動的に返すことができません。「Accepts」HTTP ヘッダーを使用し、「application/json」に設定しています。以下の構成で MIME タイプをマッピングしたのと同じです。

応答で JSON を取得できる唯一の方法は、system.serviceModel/behaviors/serviceeBehaviors/behavior[@name='REST']/webFormatter/formatters/@defaultMimeType属性を「application/json」に設定することです。これは、WebDispatchFormatter が確実に出力に関与していることを証明しています。使用するフォーマッタを決定するために Accept HTTP ヘッダーを使用していないだけです。

WebDispatchFormatter に Accept HTTP ヘッダーを表示させるにはどうすればよいですか? これがデフォルトの動作であるという印象を受けました。

次のように、Web.config ファイルで WcfRestContrib の WebDispatchFormatter を使用するようにサービスを構成しました。

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="webFormatter" type="WcfRestContrib.ServiceModel.Configuration.WebDispatchFormatter.ConfigurationBehaviorElement, WcfRestContrib" />
        </behaviorExtensions>
    </extensions>

    <bindings>
        <webHttpBinding>
            <binding name="REST"/>
        </webHttpBinding>
    </bindings>

    <behaviors>
        <endpointBehaviors>
            <behavior name="REST">
                <webHttp automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Xml"/> <!-- Note: I also tried it with automaticFormatSelectionEnabled set to "false". -->
            </behavior>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="REST">
                <webFormatter>
                    <formatters defaultMimeType="application/xml">
                        <formatter mimeTypes="application/xml,text/xml" type="WcfRestContrib.ServiceModel.Dispatcher.Formatters.PoxDataContract, WcfRestContrib" />
                        <formatter mimeTypes="application/json" type="WcfRestContrib.ServiceModel.Dispatcher.Formatters.DataContractJson, WcfRestContrib" />
                        <formatter mimeTypes="application/x-www-form-urlencoded" type="WcfRestContrib.ServiceModel.Dispatcher.Formatters.FormUrlEncoded, WcfRestContrib" />
                    </formatters>
                </webFormatter>
                <serviceDebug includeExceptionDetailInFaults="True"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <services>
        <service name="MyService.REST" behaviorConfiguration="REST">
            <endpoint name="REST" contract="MyService.IREST" bindingConfiguration="REST" behaviorConfiguration="REST" binding="webHttpBinding" />
        </service>
    </services>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

私のサービスインターフェース/コントラクトは次のようになります。

namespace MyService
{
    [ServiceContract]
    public partial interface IREST
    {
        [OperationContract]
        [WebInvoke(Method="POST")]
        [WebDispatchFormatter(WcfRestContrib.ServiceModel.Dispatcher.WebDispatchFormatter.FormatterDirection.Outgoing)]
        List<MyData> GetData(SearchQuery searchQuery);
    }
}

私のサービスの実装は次のようになります。

namespace MyService
{
    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
    public partial class REST : IREST
    {
        public List<MyData> GetData(SearchQuery searchQuery)
        {
            return GetTheData(searchQuery);
        }
    }
}
4

1 に答える 1