我试图了解IIS 7.5如何处理POST和PUT请求.
我正在使用OpenRasta框架编写RESTful服务.POST操作没有任何问题,但相同URL的PUT操作不会.它返回如下错误
Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
Run Code Online (Sandbox Code Playgroud)
网址如下"http://localhost/MyService/Resource.Something.manifest"
相同的设置在Visual Studio开发IIS中工作正常.
解
基本上默认的ExtensionlessUrlHandler不接受PUT和DELETE动词.只需要添加它们.
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
Run Code Online (Sandbox Code Playgroud) 我正在尝试对ASP.NET MVC控制器操作执行跨域POST请求.此控制器操作接受并使用各种参数.问题是,当预检请求发生时,控制器操作实际上会尝试执行,因为OPTIONS请求没有传递任何数据,控制器操作会抛出500 HTTP错误.如果我删除使用该参数的代码或参数本身,则整个请求链成功完成.
这是如何实现的一个例子:
控制器动作
public ActionResult GetData(string data)
{
return new JsonResult
{
Data = data.ToUpper(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
Run Code Online (Sandbox Code Playgroud)
客户端代码
<script type="text/javascript">
$(function () {
$("#button-request").click(function () {
var ajaxConfig = {
dataType: "json",
url: "http://localhost:8100/host/getdata",
contentType: 'application/json',
data: JSON.stringify({ data: "A string of data" }),
type: "POST",
success: function (result) {
alert(result);
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Error: Status: ' + textStatus + ', Message: ' + errorThrown);
}
};
$.ajax(ajaxConfig);
});
});
</script> …Run Code Online (Sandbox Code Playgroud) 我正在进行CORS POST请求并将Content-Type标头设置为json.这会触发Preflight OPTIONS请求触发(这很好并且预期)
此OPTIONS请求以200 OK响应,但这不是来自我的WebAPI应用程序.
我有一个自定义的消息处理程序,它永远不会受到影响,因此在看到ASP.NET之前,IIS会响应请求.
我找到了几个关于这个主题的帖子,他们说了以下内容
确保卸载/删除/禁用WebDav - 完成
确保删除/更改OPTIONSVerbHandler以使用aspnet_isapi.dll - 同时尝试
确保extensionlessURLHandler包含OPTIONS动词 - DONE
但是,我的选项请求仍然被劫持.我的意思是,IIS以200 OK响应,但在响应中不包括Access-Control-Allow-Origin标头.它不包括此标头,因为它永远不会到我设置此标头的WebAPI CORS代码.
我能找到的两个最好的帖子听起来像是我的问题
在这里:http://brockallen.com/2012/10/18/cors-iis-and-webdav/
我尝试在IIS中打开失败请求跟踪(FERB)并将其设置为跟踪所有200个状态代码.我没有看到选项请求被记录...不确定这是否意味着FERB不跟踪OPTIONS请求或者我是否需要更改FERB设置中的某些内容以使其跟踪OPTIONS请求,或者如果这是一条线索我的问题是什么?
这是在IIS 7.5上运行的ASP.NET WebAPI 2.0(也在IIS 8和IISExpress上测试,结果相同)无论什么浏览器(Chrome,FF和IE都以相同的方式失败)
我已经尝试了我能找到的关于这个主题的所有内容,仍然无法解决我的问题.
帮帮我StackOverflow,你是我唯一的希望.