目前部署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{
}
参考链接
(大佬的文章实在难收到,偶然发现的)