Cors跨域

时间:2017-05-11 06:00:38

标签: c# ajax asp.net-mvc cors

我们有一个写得非常糟糕的遗留WebSite应用程序,我们正试图慢慢转换为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。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://localhost:49252'因此不允许访问。

令人困惑的是,Ajax调用使其成为控制器方法,但我似乎无法从中返回值。

更新

即使我从WebApiConfig和控制器中删除了对Cors的所有引用,仍然会达到MVC方法,我也会遇到同样的错误。

1 个答案:

答案 0 :(得分:1)

如评论中所述,EnableCors属性仅适用于WebAPI控制器。如果要将CORS标头添加到常规MVC方法,可以手动完成。

例如,这里是我过去使用的一些代码:

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]添加到相关方法中。