无法让HttpPut动作起作用

时间:2013-09-18 22:29:42

标签: c# asp.net iis

我有一个与Web服务对话的MVC应用程序(用C#编写,通常在Azure中运行,但我在IIS Express中本地运行它以进行调试)。 Web服务公开了一个支持HTTP GET和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,我看到浏览器实际上是在发出OPTIONS请求,而不是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]并使用$.ajax调用POST)。但我们正在尝试尽可能使我们的API成为RESTful,对于这个特定的动作,使用的适当动词是PUT。

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

更新:如果我使用IE(10),仅使用FireFox和Chrome,则不会出现此问题。根据Fiddler IE直接发出一个PUT请求,这是有效的。另一方面,FireFox和Chrome会发出OPTIONS请求,其结果为Allow: OPTIONS, TRACE, GET, HEAD, POST(没有PUT,所以我猜这就是为什么它不起作用)。

1 个答案:

答案 0 :(得分:1)

问题是默认情况下,IIS Express不支持 PUT DELETE 谓词。但是,这可以很容易地解决。 IIS Express FAQ page向我们展示了如何做到。

  1. 第一步是转到IIS Express配置目录。此目录的路径为%userprofile%\documents\IISExpress\config。只需在资源管理器中输入此路径,即可打开配置目录。
  2. 在文本编辑器中打开applicationhost.config文件。
  3. 搜索包含以下条目的行:<add name="ExtensionlessUrl-Integrated-4.0"
  4. 在该行中,您将找到支持的动词。默认情况下,verbs属性配置如下:verb="GET,HEAD,POST,DEBUG"您可以看到没有提及 PUT DELETE 谓词。要添加对这些谓词的支持,只需将其添加到verb属性:verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
  5. 即可
  6. 最后一步是重新启动IIS Express,让它获取配置文件中的更改。
  7. 执行这些步骤后,IIS Express将处理 PUT DELETE 请求。