为什么我的WCF REST服务中的自定义谓词返回404?

时间:2014-07-14 15:31:02

标签: .net wcf rest iis iis-express

我为ServiceContract修饰了将其作为RESTful服务发布所需的WebInvoke属性:

    [OperationContract]
    [WebInvoke(Method = "Authenticate", UriTemplate = "User")]
    AuthenticateUserOutput AuthenticateUser(AuthenticateUserInput input);

然后我使用ServiceRoute

来托管它
RouteTable.Routes.Add(new ServiceRoute("", new ServiceHostFactory(), typeof(MyWcfService)));

WCF REST帮助页面将User列为URI,将Authenticate列为动词

但是,如果我将REST测试客户端指向它,它将返回404。

为什么我不能使用自定义动词?

2 个答案:

答案 0 :(得分:0)

解决方案是在IIS级别或我的首选项在web.config级别更改您的<system.webServer>部分。

我认为这需要IIS7.0 +和.net 4.0+以及集成的应用程序池。

只需在<configuration>

下添加以下元素(或现有的元素)即可
<system.webServer>
    <handlers>
        <remove name="ExtensionlessUrl-Integrated-4.0"/>
        <add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
    </handlers>
    <security>
        <requestFiltering>
            <verbs allowUnlisted="true"/>
        </requestFiltering>
    </security>
</system.webServer>

需要注意的重要变化是:

verb="*" 这通知该处理程序匹配任何动词

这会将请求过滤切换到最宽松的状态,默认情况下允许所有动词。

有关如何在其他版本的IIS中配置此文档的文档:

http://www.iis.net/configreference/system.webserver/handlers http://www.iis.net/configreference/system.webserver/security/requestfiltering/verbs

答案 1 :(得分:0)

首先是,

[WebInvoke(Method = "Authenticate")]

对我没有任何意义。

尝试,

[WebInvoke(Method = "GET"), UriTemplate = "User")]

然后在web.config中进行更改,以获得宁静的服务。

  <endpointBehaviors>
    <behavior name="EndPointBehaviour">
      <webHttp />
    </behavior>
  </endpointBehaviors>

  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />          
    </behavior>
  </serviceBehaviors>

最后, 在服务标签添加下,

<endpoint binding="webHttpBinding"   behaviorConfiguration="EndPointBehaviour" name="ServiceEndPoint" contract="WcfService.IService1" />