我有一个与 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]
并调用$.ajax
with 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,所以我想这就是它不起作用的原因)。