C# Can';无法使HttpPut操作正常工作

C# Can';无法使HttpPut操作正常工作,c#,asp.net,iis,C#,Asp.net,Iis,我有一个与web服务对话的MVC应用程序(用C#编写,通常在Azure中运行,但我在IIS Express中本地运行它以进行调试)。web服务公开了一个支持HTTPGET和POST的API,我正在尝试添加PUT。目前,所有web服务控制器都有标记为[HttpGet]或[HttpPost]的方法(参数分别为[FromUri]或[FromBody])。我向现有控制器添加了一个方法,并将其标记为[HttpPut],参数为[FromBody]。看起来是这样的: [HttpPut] public Http

我有一个与web服务对话的MVC应用程序(用C#编写,通常在Azure中运行,但我在IIS Express中本地运行它以进行调试)。web服务公开了一个支持HTTPGET和POST的API,我正在尝试添加PUT。目前,所有web服务控制器都有标记为
[HttpGet]
[HttpPost]
的方法(参数分别为
[FromUri]
[FromBody]
)。我向现有控制器添加了一个方法,并将其标记为
[HttpPut]
,参数为
[FromBody]
。看起来是这样的:

[HttpPut]
public HttpResponseMessage UpdateLastCheck(HttpRequestMessage httpRequest, [FromBody] RequestParameters requestParameters)
{
    return Process(httpRequest, (RequestParameters)requestParameters, DoUpdateLastCheck);
}
在客户端,我使用jQuery$.ajax直接调用API:

$.ajax({
    url: url,
    type: 'PUT',
    dataType: "application/json",
    data: data,
    complete: completeCallback,
    success: function (data)
    {
        ...
    },
    error: errorCallback
});
发生的情况是请求没有进入我的代码。它在某处被截获,我不知道在哪里。运行Fiddler时,我看到浏览器实际上发出了一个选项请求,而不是PUT请求:

OPTIONS http://localhost/ViewPoint.Web.API/Notification/UpdateLastCheck HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://localhost:9999
Access-Control-Request-Method: PUT
Connection: keep-alive
服务器正在响应以下命令:

HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/8.0
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
Date: Wed, 18 Sep 2013 22:21:20 GMT
Content-Length: 0
PUT不在允许列表上,我不知道为什么。我的web.config文件中是否缺少某些内容?我甚至不知道它是如何建立这个列表的——对解决方案的全局搜索没有找到任何结果

如果我将所有内容都更改为POST,它就可以正常工作(即使用
[HttpPost]
并使用
POST
调用
$.ajax
)。但是我们正试图使我们的API尽可能的RESTful,对于这个特定的操作,适当的动词是PUT

抱歉,如果我没有解释清楚,这是我的第一个web服务API,我不确定你们需要知道什么来诊断问题。如果这是一个IIS配置问题,当我推到Azure时会发生什么


更新:如果我只在FireFox和Chrome上使用IE(10),这个问题就不会发生。根据Fiddler的说法,IE直接发出一个PUT请求,这样就行了。另一方面,FireFox和Chrome发出一个选项请求,其结果是
Allow:OPTIONS、TRACE、GET、HEAD、POST
(没有PUT,所以我想这就是它不起作用的原因)。

问题是默认情况下,IIS Express不支持PUTDELETE动词。然而,这很容易纠正。这本书向我们展示了如何

  • 第一步是转到IIS Express配置目录。此目录的路径是
    %userprofile%\documents\IISExpress\config
    。只需在浏览器中输入此路径,它就会打开配置目录
  • 在文本编辑器中打开
    applicationhost.config
    文件

  • 搜索包含以下条目的行:
    很遗憾,它仍然不工作。我更新了
    ExtensionlessUrl-ISAPI-4.0\u 32位
    ExtensionlessUrlHandler-ISAPI-4.0\u 64位
    ,以及
    ExtensionlessUrl-Integrated-4.0
    ,并将它们都设置为“GET、HEAD、POST、DEBUG、PUT、DELETE”。我甚至重新启动了电脑,以确保IIS重新启动。