概述
前后端分离开发模式,一定会遇到跨域的问题。这里收集了2种 C# Asp.Net webapi 相关的跨域解决方案,方便后续查找参考。
2021/10/28 更新: 有更加简单高效的方式推荐《C# ASP.NET MVC/WebApi 或者 ASP.NET CORE 最简单高效的跨域设置》
方案一:官方nuget扩展 Microsoft.AspNet.WebApi.Cors
第一步:搜索安装Microsoft官方扩展包:Microsoft.AspNet.WebApi.Cors
第二步:配置跨域条件
修改 App_Start/WebApiConfig.cs 添加跨域条件:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// 添加跨域设置
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "XXX/{controller}/{action}/{id}",
//routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
这里未对跨域做任何限制,如果追求更高的安全性,有很多高级的设置,可以参考文章:https://www.cnblogs.com/landeanfen/p/5177176.html
方案二:自定义判断请求头
针对一般处理程序(.ashx)可以通过判断请求头来处理跨域访问。
在ProcessRequest方法中判断请求头,并设置返回头文件:
//支持跨域访问.
string origin = context.Request.Headers["Origin"];
if (string.IsNullOrEmpty(origin) == false)
{
context.Response.Headers["Access-Control-Allow-Origin"] = origin;
// context.Response.Headers["Access-Control-Allow-Origin"] = "*";
context.Response.Headers["Access-Control-Allow-Credentials"] = "true";
context.Response.Headers["Access-Control-Allow-Headers"] = "x-requested-with,content-type";
}