我们有一个写得非常糟糕的遗留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方法,我也会遇到同样的错误。
答案 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]
添加到相关方法中。