Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WebDispatchFormatter忽略“;接受;HTTP头处理模块_.net_Wcf_Rest_.net 4.0 - Fatal编程技术网

.net WebDispatchFormatter忽略“;接受;HTTP头处理模块

.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

我在VS2010、.NET4中有一个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
{
[服务合同]
公共部分接口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的一个更好的框架。谢谢,我来看看。