我有一个与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,所以我猜这就是为什么它不起作用)。
答案 0 :(得分:1)
问题是默认情况下,IIS Express不支持 PUT 和 DELETE 谓词。但是,这可以很容易地解决。 IIS Express FAQ page向我们展示了如何做到。
%userprofile%\documents\IISExpress\config
。只需在资源管理器中输入此路径,即可打开配置目录。applicationhost.config
文件。<add name="ExtensionlessUrl-Integrated-4.0"
verb="GET,HEAD,POST,DEBUG"
您可以看到没有提及 PUT 或 DELETE 谓词。要添加对这些谓词的支持,只需将其添加到verb
属性:verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
执行这些步骤后,IIS Express将处理 PUT 和 DELETE 请求。