最近在写个webapi 的接口服务,正常后端请求没什么问题。
但想对方可以直接用ajax 进行调用,那么接口就得支持跨域访问才行。
网上找了一下,发现通常有两种方式。
1.在webapi路由里面配置,EnableCorsAttribute 属性进行配置。
2.在web.config 里面配置。
在webapi 的apicontroller 里面增加函数:
public class SearchApiController : ApiController
{//
IDALPage dalpage;
public SearchApiController()
{
dalpage = new DALPage();
}
//ajax 跨域访问必须函数
public string Options()
{
return null; // HTTP 200 response with empty body
}
........
}
直接返回null。
- webapi 路由中配置,需要引用 Microsoft.AspNet.Cors,通过NuGet 进行获取。
- 引用Microsoft.AspNet.Cors 完成之后,
- 修改webapi 路由代码:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { //跨域配置 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
new EnableCorsAttribute("*", "*", "*") 可以根据需要改成web.config 里面配置的值。
public static void Register(HttpConfiguration config) { //跨域配置 // config.EnableCors(new EnableCorsAttribute("*", "*", "*")); //跨域配置 var allowedMethods = ConfigurationManager.AppSettings["cors:allowedMethods"]; var allowedOrigin = ConfigurationManager.AppSettings["cors:allowedOrigin"]; var allowedHeaders = ConfigurationManager.AppSettings["cors:allowedHeaders"]; var geduCors = new EnableCorsAttribute(allowedOrigin, allowedHeaders, allowedMethods) { SupportsCredentials = true }; config.EnableCors(geduCors); // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); }
- 修改Global Application_Start 中的注册webapi 路由的代码:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// WebApiConfig.Register(GlobalConfiguration.Configuration);//原代码
GlobalConfiguration.Configure(WebApiConfig.Register);//修改后。
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
以上配置及代码在调试中使用没有问题,可以实现ajax 跨域请求。即 使用vs自带的IIS Express 运行。但发布到IIS 正式环境上后,发现ajax 跨域请求不成功。
2. 部署到IIS 正式环境的配置, 直接在web.config 中配置跨域请求参数
注意:需要屏蔽webapi 路由配置的代码。// config.EnableCors(....)
在web.config 的<system.webServer>节点里面增加一下配置:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type,X-Requested-With" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
上述为个人遇到的情况及解决方式。如果您有更好的方式,欢迎留言,大家一起探讨一下。