asp.net webapi 跨域访问 在vs调试里面和部署到IIS里面的配置问题

最近在写个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。

  1. webapi 路由中配置,需要引用 Microsoft.AspNet.Cors,通过NuGet 进行获取。
  2. 引用Microsoft.AspNet.Cors 完成之后,asp.net webapi 跨域访问 在vs调试里面和部署到IIS里面的配置问题
  3. 修改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 }
               );
    
    
            }

    asp.net webapi 跨域访问 在vs调试里面和部署到IIS里面的配置问题

  4. 修改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>

上述为个人遇到的情况及解决方式。如果您有更好的方式,欢迎留言,大家一起探讨一下。