在IIS托管的WCF REST服务不支持PUT和DELETE方法。

8
我使用微软的WCF REST服务模板40在.NET 4中创建了一个WCF REST(又称WebHttp)服务,并将其托管在IIS 6中。该服务模板使用Global.asax中的RouteTable来创建“干净”的URL,不包括“.svc”在其中。例如:http://localhost/flights/878。对于此URL,GET和POST工作正常,但PUT和DELETE会导致HTTP 501“未实现”。如果我创建一个简单的.svc文件,如下所示:
<%@ ServiceHost Language="C#" Debug="true" Service="MyProject.FlightsService"%>

那么我可以使用PUT和DELETE来访问此URL:

http:// localhost / flightsservice.svc / 878

有人知道是否可能使PUT和DELETE对上述“干净”的URL起作用吗?似乎没有办法配置IIS以允许此操作,因为没有文件扩展名可供配置设置,并且我不想全局允许PUT和DELETE。


看看如何在IIS 7.5上解决类似的问题这里。解决方案非常优雅。 - lmsasu
2个回答

4
我已经有一段时间没有使用IIS6了(而且我没有安装它,所以我只能从记忆中回忆),但是我曾经不得不在IIS6中实现类似的东西,以便为IIS6中的路由无扩展名的URL。
您可以通过黑客IIS Manager逐个启用文件夹上的通配符脚本映射。 我遵循了这个博客文章,它非常有效(这个链接提供了更多背景信息)。 这实际上是管理器中的错误,而不是IIS本身(至少我是这样告诉自己的)。

您是否可以在网站的子文件夹中引用您的服务(例如http://localhost/services/flight/878)? 如果是这样,并且您实现了上面的IIS Manager hack,则我认为您可以为该目录启用所有HTTP动词。 再次强调,我只是凭记忆说话(我们只实现了GET和POST,因此我没有处理PUT和DELETE),所以我希望我说得对。

如果您需要更多信息或者我的记忆出现问题,请告诉我。 :) 我希望这可以帮助您!


谢谢,这个方法很有效!由于我的IIS应用程序只包含服务,所以我按照您发布的第二个链接中描述的方式设置了整个应用程序的通配符映射。非常感谢!Mike - Mike Taverne
一定要喜欢那些“未记录”的功能。 :) 很高兴它对你有用。 - David Hoerster

2
如果您的Web应用程序需要部署到多个开发/生产环境中,最好的方式似乎是在web.config级别禁用WebDAV。要做到这一点,请按照以下示例删除WebDAVModule和WebDAV处理程序:
<system.webserver>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webserver>

1
问题是如何在应用程序级别上启用IIS中的PUT和DELETE。 - deleted_user
1
是的,这将导致IIS仅允许当前应用程序使用它,而不是全局启用,就像原帖中所要求的那样。如果您不删除WebDAV模块和处理程序,则PUT和DELETE请求将被它们劫持并无法正常工作。 - DanilF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接