.net WebDispatchFormatter忽略“;接受;HTTP头处理模块
我在VS2010、.NET4中有一个WCF项目。我使用WcfRestContrib是为了支持我的服务调用的多个无缝格式化程序。这不管用。我能够提交一个带有JSON负载的查询,但是我不能让它在响应中自动返回JSON数据。我正在使用“Accepts”HTTP头并将其设置为“application/json”——正如我在下面的配置中映射了mime类型一样 让JSON在响应中返回的唯一方法是将.net WebDispatchFormatter忽略“;接受;HTTP头处理模块,.net,wcf,rest,.net-4.0,.net,Wcf,Rest,.net 4.0,我在VS2010、.NET4中有一个WCF项目。我使用WcfRestContrib是为了支持我的服务调用的多个无缝格式化程序。这不管用。我能够提交一个带有JSON负载的查询,但是我不能让它在响应中自动返回JSON数据。我正在使用“Accepts”HTTP头并将其设置为“application/json”——正如我在下面的配置中映射了mime类型一样 让JSON在响应中返回的唯一方法是将system.serviceModel/behaviors/serviceeBehaviors/behavior
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
{
[服务合同]
公共部分接口IREST
{
[经营合同]
[WebInvoke(Method=“POST”)]
[WebDispatchFormatter(WcfRestContrib.ServiceModel.Dispatcher.WebDispatchFormatter.FormatterDirection.Outgoing)]
List GetData(搜索查询);
}
}
我的服务实现如下所示:
namespace MyService
{
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public partial class REST : IREST
{
public List<MyData> GetData(SearchQuery searchQuery)
{
return GetTheData(searchQuery);
}
}
}
namespace-MyService
{
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
公共部分类休息:IREST
{
公共列表GetData(搜索查询)
{
返回GetTheData(searchQuery);
}
}
}
原来我使用的是Accept
而不是Accept
作为HTTP头键!哎呀 不知道您目前在使用WCF Web API方面的开发投资是多少,但您应该知道这一点。如果您正在使用WCF Web API启动一个新项目,那么一定要使用ASP.NET Web API,它是创建HTTP API的一个更好的框架。谢谢,我来看看。