asp.net mvc、webform 跨域问题

目前部署mvc5老项目时,其余项目调用该api ,出现跨域问题,以下几种解决方式。

webapi 暂不在考虑范围内,可以安装cors包进行启用

1. iis web.config 中添加跨域配置 (如果无效请看下一个解决方式)

<!-- system.webServer 中添加-->
  <system.webServer>
  <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELET, OPTIONS"/>
    <!--可以根据需求添加 -->
          <add  name="Access-Control-Allow-Headers" value="Content-Type, Authorization"/>
        </customHeaders>
      </httpProtocol>
  </system.webServer>

2. global.asax 中添加(无效再看下一个)

  protected void Application_BeginRequest(object sender, EventArgs e)
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
                HttpContext.Current.Response.End();
            }

        }

3.添加特性 CorsCustomAttribute ,有需要的控制上加入[CorsCustom]

 public class CorsCustomAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.HttpMethod == "OPTIONS")
            {
                var response = filterContext.HttpContext.Response;
                response.Headers.Add("Access-Control-Allow-Origin", "*");
                response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");


                filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.OK);
 
                return;
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var rsp = filterContext.HttpContext.Response;
            if (!rsp.Headers.AllKeys.Contains("Access-Control-Allow-Origin"))
            {
                rsp.Headers.Add("Access-Control-Allow-Origin", "*");
                rsp.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                rsp.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");
            }
            base.OnActionExecuted(filterContext);
        }


    }

4.上述还无效,直接把所有的上方的配置全部移除,采用下方的(终极解决方案)

新建一个基控制器,要跨域的控制继承这个基控制器,代码如下:

    /// <summary>
    /// 基控制器
    /// </summary>

    public class BaseApiController :  Controller
    {
        protected override void Initialize(RequestContext requestContext)
        {
            var response = requestContext.HttpContext.Response;
            bool right = requestContext.HttpContext.Request.HttpMethod == "OPTIONS";
            if (right)
            {
                //支持跨域
                response.AddHeader("Access-Control-Allow-Methods", "*");
                response.AddHeader("Access-Control-Allow-Headers", "*");
                response.AddHeader("Access-Control-Allow-Origin", "*");
                response.AddHeader("Cache-Control", "no-cache");
                response.StatusCode = 200;
                response.End();
            }
            else
            {
                response.AddHeader("Access-Control-Allow-Origin", "*");
                response.AddHeader("Access-Control-Allow-Headers", "*");
                response.AddHeader("Access-Control-Allow-Methods", "*");
                response.AddHeader("Cache-Control", "no-cache");
            }
            base.Initialize(requestContext);
        }

    }

//示例
public class AccountController:BaseApiController{
}

参考链接

(大佬的文章实在难收到,偶然发现的)

asp.net mvc设置允许跨域_aspnet mvc设置controller跨域返回-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值