0

我有一个与 Web 服务对话的 MVC 应用程序(用 C# 编写,通常在 Azure 中运行,但我在 IIS Express 中本地运行它以进行调试)。Web 服务公开了一个支持 HTTP GET 和 POST 的 API,我正在尝试添加 PUT。目前所有的 Web 服务控制器都有用[HttpGet]or标记的方法[HttpPost](参数分别以[FromUri]or的形式出现[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]并调用$.ajaxwith POST)。但是我们正在尝试使我们的 API 尽可能地 RESTful,对于这个特定的操作,要使用的适当动词是 PUT。

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

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

4

1 回答 1

1

问题是默认情况下,IIS Express 不支持PUTDELETE动词。但是,这很容易解决。IIS Express 常见问题页面向我们展示了如何操作。

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

执行完这些步骤后,IIS Express 将很好地处理PUTDELETE请求。

于 2013-09-20T09:26:41.813 回答