Asp.Net WebApi2 在使用 AspNet.WebApi.Cors 5.2.3 版本时启用CORS无效。

22 浏览
0 Comments

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依赖项),它就能正常工作了:



  
  


  
  

任何帮助将不胜感激!

谢谢。

0
0 Comments

问题的出现的原因是web.config文件中的处理程序配置不正确。解决方法是将web.config文件中的处理程序配置修改为正确的配置。

0
0 Comments

问题的出现原因:使用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问题的原因和解决方法。

0
0 Comments

问题原因:在进行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不能,那么这个解决方法可能非常有效。在开发环境中,这对我有效。经过尝试了几十种方法后,这是唯一能使它工作的方法。这种方法是否仍然可接受和安全?

0