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);
}
}
}