【发布时间】:2012-11-17 10:39:36
【问题描述】:
我正在尝试对 ASP.NET MVC 控制器操作执行跨域 POST 请求。此控制器操作接受并使用各种参数。问题是当预检请求发生时,控制器动作实际上尝试执行 & 因为 OPTIONS 请求没有传递任何数据,控制器动作抛出 500 HTTP 错误。如果我删除使用参数的代码,或者参数本身,整个请求链就成功完成了。
如何实现的示例:
控制器动作
public ActionResult GetData(string data)
{
return new JsonResult
{
Data = data.ToUpper(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
客户端代码
<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>
现在,无论何时发生预检请求,它都会返回一个 500 HTTP 代码,因为“data”参数为空,因为 OPTIONS 请求没有传递任何值。
服务器应用程序已在我的本地 IIS 的 8100 端口上设置,运行客户端代码的页面设置在 8200 端口上以模拟跨域调用。
我还为主机(在 8100 上)配置了以下标头:
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Origin: http://localhost:8200
我发现的一种解决方法是检查执行操作的 HTTP 方法,如果是 OPTIONS 请求,则只返回空白内容,否则执行操作代码。像这样:
public ActionResult GetData(string data)
{
if (Request.HttpMethod == "OPTIONS") {
return new ContentResult();
} else {
return new JsonResult
{
Data = data.ToUpper(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
但我觉得这种方法很笨拙。我曾考虑将这种逻辑添加到 Attribute,但即使这样也意味着装饰将使用 CORS 调用的每个操作。
有没有更优雅的解决方案来让这个功能发挥作用?
【问题讨论】:
-
为我工作。为什么微软的一切都如此细致入微?
标签: asp.net-mvc cors