我为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。
为什么我不能使用自定义动词?
答案 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" />