之前有客户问我,如何AJAX跨域post,这个问题挺有意思,在我们看来,我是不被允许的,因为它是不安全的,但随着web api的火热,这个东西也被人们一步步的接受了,确实,有时,我们的接口希望对所有人公开,它并不在乎有人恶意去POST灌数据,呵呵!
实现思路:向HTTP请求头添加跨域标识Access-Control-Allow-Origin,将它的值设为*即可,当然如果你一个个页面去加那就太麻烦了,也不推荐,有一天老总感觉这是不安全的了,让你去掉它,只你可就麻烦大了,哈哈,所以,还有找个全局点吧!
开放的CORS过滤器,只对类开放,不支持方法单独设置
/// <summary>
/// 开放cors协议,支持跨域访问
/// </summary>
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class OpenCorsAttribute : ActionFilterAttribute
{
/// <summary>
/// 开放cors协议,支持跨域访问的初始化
/// </summary>
public OpenCorsAttribute()
{
}
/// <summary>
///在action渲染之前
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var responseHead = filterContext.RequestContext.HttpContext.Response.Headers;
if (responseHead != null)
{
responseHead.Add("Access-Control-Allow-Origin", "*");
}
base.OnActionExecuting(filterContext);
}
}
使用它也非常简单
[OpenCorsAttribute]
public class HomeController : AsyncController
{
}
而如果希望所有控制器都添加这个特性,可以在FilterConfig类中去添加全局过滤器
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new OpenCorsAttribute());
filters.Add(new GlobalErrorAttribute());
filters.Add(new HandleErrorAttribute());
filters.Add(new UrlRuleFilterAttribute());
}
这样,你所有的Action也被破加上了这个特性,当然,如果你手动向Action上这是不被允许的,因为我们设置了AttributeUsage(AttributeTargets.Class),呵呵
程序截图

本文转自博客园张占岭(仓储大叔)的博客,原文链接:WebApi系列~开放的CORS,跨域资源访问对所有人开放,如需转载请自行联系原博主。