我已经从一个MVC4/ web API模板开始设置了一个ASP.NET Web应用程序。看起来一切都很顺利--据我所知没有任何问题。我已经用Chrome和Firefox浏览了这个网站。我使用Fiddler进行了测试,所有的反应似乎都是在金钱上。
因此,现在我继续编写一个简单的Test.aspx来使用这个新的Web API。脚本的相关部分:
<script type="text/javascript">
$(function () {
$.ajax({
url: "http://mywebapidomain.com/api/user",
type: "GET",
contentType: "json",
success: function (data) {
$.each(data, function (index, item) {
....
});
}
);
},
failure: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("An error occurred, please try again. " + textStatus);
}
});
});
</script>
这将生成一个请求头:
OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.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://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
按原样,Web API返回不允许的405方法。
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96
<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>
我知道默认情况下,选项动词并没有连接到Web API控制器中……因此,我在我的UserController.cs中放置了以下代码:
// OPTIONS HTTP-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
...and这消除了405方法不允许的错误,但响应完全为空-不返回任何数据:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0
一定有额外的逻辑。我不知道如何正确编码Options方法,也不知道控制器是否是放置代码的合适位置。奇怪的是(对我来说),Web API站点在火狐或Chrome浏览器上能正常响应,而上面的.ajax调用却出错了。如何处理.ajax代码中的“印前检查”?也许我应该在客户端的.ajax逻辑上解决这个问题?或者,如果这是服务器端由于未处理OPTIONS谓词而出现的问题。
有人能帮上忙吗?这肯定是一个非常常见的问题,如果这里有人回答了,我很抱歉。我搜索了一下,但没有找到任何有用的答案。
更新 IMHO,这是一个客户端问题,与上面的Ajax JQuery代码有关。我这么说是因为当我从web浏览器访问mywebapidomain/api/user时,Fiddler不会显示任何405错误标头。我唯一可以重现这个问题的地方是JQuery .ajax()调用。此外,当在服务器(相同的域)上运行时,上面相同的Ajax调用也可以很好地工作。
我发现了另一个帖子:Prototype AJAX request being sent as OPTIONS rather than GET; results in 501 error,这似乎是相关的,但我已经修补了他们的建议,但没有成功。显然,JQuery的编码方式是这样的:如果Ajax请求是跨域的(我的就是跨域的),它会添加几个头,以某种方式触发OPTIONS头。
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
似乎应该有一个比在JQuery中修改核心代码更好的解决方案……
下面提供的答案假设这是一个服务器端问题。也许吧,我猜,但我倾向于客户,而打电话给托管提供商是没有帮助的。
https://stackoverflow.com/questions/19095777
复制相似问题