跨域的 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 问题的主要内容,如果未能解决你的问题,请参考以下文章

CORS跨域的限制与解决

JSONP跨域和CORS跨域的区别

跨域的 Cors 问题

跨域的问题(jsonp和cors)

跨域和CORS

解决ajax跨域的方法原理详解之Cors方法