跨域的 Cors 问题
Posted
技术标签:
【中文标题】跨域的 Cors 问题【英文标题】:Cors issue across domains 【发布时间】:2017-10-09 23:54:40 【问题描述】:我们有一个写得很糟糕的遗留网站应用程序,我们正在尝试慢慢地转换为 MVC。
作为其中的一部分,我们将创建一组 MVC 控制器,我们希望能够从旧网站调用它们作为权宜之计。
到目前为止,我在网站 aspx 页面中有以下内容作为单击按钮的事件;
function CallControllerMethod()
$.ajax(
type: 'GET',
dataType: "text",
url: "http://localhost:49443/Home/TestAjaxMethod",
success: function (response)
alert(response);
,
error: function (e)
console.log(e);
);
这会调用MVC项目中的一个控制器方法;
[EnableCors("*", "*", "*")]
public class HomeController : Controller
[HttpGet]
[EnableCors("*","*","*")]
public int TestAjaxMethod()
return 10;
在 MVC 应用程序的 WebApiConfig 中,我有这个;
var cors = new EnableCorsAttribute("*", "*", "*");
configuration.EnableCors(cors);
所以当我从网站调用控制器方法时,我在 mvc 控制器中的断点被命中。但是,当我返回 10 的值时,在网站 ajax 调用上出现以下错误;
XMLHttpRequest 无法加载 http://localhost:49443/Home/TestAjaxMethod。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:49252' 因此不允许访问。
令人困惑的是,Ajax 调用使它进入了控制器方法,但我似乎无法从中返回值。
更新
即使我从 WebApiConfig 和控制器中删除对 Cors 的所有引用,仍然会到达 MVC 方法并且我得到相同的错误。
【问题讨论】:
您是否尝试过例如将返回类型更改为JsonResult
并将返回代码更改为return Json(new Result = 10 );
?
我正在返回 json 但我遇到了同样的错误,所以我试图让测试尽可能简单
Webapi 属性对 mvc 控制器没有影响。
对,我注意到了 :) 那是什么?
有什么理由不能使用 webapi 控制器?
【参考方案1】:
如 cmets 中所述,EnableCors
属性仅适用于 WebAPI 控制器。如果你想在常规 MVC 方法中添加 CORS 头,你可以手动完成。
例如,这是我过去使用过的一些代码:
var origin = Request.Headers["Origin"];
if (origin != null)
Response.AddHeader("Access-Control-Allow-Origin", origin);
或者,您可以创建自己的属性:
public class AddCorsHeader : ActionFilterAttribute
public override void OnActionExecuted(HttpActionExecutedContext context)
IEnumerable<string> origin;
if (context.Request.Headers.TryGetValues("Origin", out origin))
context.Response.Headers.Add("Access-Control-Allow-Origin", origin);
然后在相关方法中添加[AddCorsHeader]
。
【讨论】:
以上是关于跨域的 Cors 问题的主要内容,如果未能解决你的问题,请参考以下文章