Asp.Net WebApi2 在使用 AspNet.WebApi.Cors 5.2.3 版本时启用CORS无效。
Asp.Net WebApi2 在使用 AspNet.WebApi.Cors 5.2.3 版本时启用CORS无效。
我尝试按照http://enable-cors.org/server_aspnet.html上的步骤来使我的RESTful API(使用ASP.NET WebAPI2实现)能够与跨域请求(启用CORS)一起工作。除非我修改web.config,否则它不起作用。
我安装了WebApi Cors依赖项:
install-package Microsoft.AspNet.WebApi.Cors -ProjectName MyProject.Web.Api
然后在我的App_Start
中,我有一个名为WebApiConfig
的类,如下所示:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var corsAttr = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(corsAttr); var constraintsResolver = new DefaultInlineConstraintResolver(); constraintsResolver.ConstraintMap.Add("apiVersionConstraint", typeof(ApiVersionConstraint)); config.MapHttpAttributeRoutes(constraintsResolver); config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config)); //config.EnableSystemDiagnosticsTracing(); config.Services.Replace(typeof(ITraceWriter), new SimpleTraceWriter(WebContainerManager.Get())); config.Services.Add(typeof(IExceptionLogger), new SimpleExceptionLogger(WebContainerManager.Get ())); config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler()); } }
但是在运行应用程序之后,我使用Fiddler请求一个资源,例如:
http://localhost:51589/api/v1/persons
在响应中,我看不到应该看到的HTTP头,例如:
Access-Control-Allow-Methods: POST, PUT, DELETE, GET, OPTIONS
Access-Control-Allow-Origin: *
我是否漏掉了某个步骤?我尝试在控制器上使用以下注释:
[EnableCors(origins: "http://example.com", headers: "*", methods: "*")]
相同的结果,CORS未启用。
然而,如果我在我的web.config中添加以下内容(甚至不安装AspNet.WebApi.Cors依赖项),它就能正常工作了:
任何帮助将不胜感激!
谢谢。
问题的出现原因:使用Asp.Net WebApi2的Enable CORS功能时,配合使用AspNet.WebApi.Cors 5.2.3版本时,不能正常工作。
解决方法:通过对项目的代码和配置进行调整,可以解决这个问题。具体的解决方法如下:
1. 在Global.ascx文件中,调用WebApiConfig的Register方法,用于注册WebApi的配置。
2. 在WebApiConfig.cs文件中,通过EnableCrossSiteRequests方法启用跨域请求,使用EnableCorsAttribute来设置允许的来源、头信息和请求方法。
3. 在ValuesController.cs文件中,使用EnableCors特性来设置特定的请求方法的跨域请求。
4. 不需要在Web.config文件中添加任何特殊的配置。
5. 通过访问API链接来测试跨域请求是否生效。
以上就是解决Asp.Net WebApi2 Enable CORS not working with AspNet.WebApi.Cors 5.2.3问题的原因和解决方法。
问题原因:在进行CORS请求时,现代浏览器会先发送一个OPTIONS请求,然后再发送真正的请求。这个OPTIONS请求用于在CORS请求时向用户提示确认。但是在API中,如果希望跳过这个验证过程,可以在Global.asax中添加以下代码片段。
解决方法:
在Global.asax中添加以下代码:
protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } }
在这里,我们通过检查OPTIONS请求来绕过验证过程。
感谢回答者的解答,但是这种http级别的配置应该由Microsoft.AspNet.WebApi.Cors这个依赖项自动处理,这样我们就不需要在代码中明确配置它。我可以通过在web.config中进行类似的配置使其工作,但重点是要使用Microsoft.AspNet.WebApi.Cors来处理它并且可以进行属性配置。
如果你不想完全跳过验证过程,至少在生产环境中是不建议这样做的。如果你想使用内置的功能,可以正确配置CORS,然后忽略OPTIONS请求的路由,详细信息请参考我的回答。
如果你发现IE可以正常工作,而Chrome和Firefox不能,那么这个解决方法可能非常有效。在开发环境中,这对我有效。经过尝试了几十种方法后,这是唯一能使它工作的方法。这种方法是否仍然可接受和安全?