chrome 中的 Angularjs 应用程序中的 CORS 错误访问 .NET Web Api

Posted

技术标签:

【中文标题】chrome 中的 Angularjs 应用程序中的 CORS 错误访问 .NET Web Api【英文标题】:CORS error in Angularjs app in chrome accessing .NET Web Api 【发布时间】:2016-05-07 07:20:04 【问题描述】:

我已经阅读了大量关于 CORS 和 angular 的现有问题 - 以及它如何不是 angular 的问题,但需要在服务器上进行设置。我尝试了很多建议,但都无法奏效。

我的 ASP MVc 页面中有一个 angularJS 应用程序。 它从我启用了 CORS 的 web api 2 应用程序获取数据(格式为 JSON)。

控制器是:

    [EnableCors("http://localhost:3419", "*", "*")]
    public class DashboardsController : ApiController
    
        private IDashboardService _dashboardService;

        public DashboardsController(IDashboardService dashboardService)
        
            this._dashboardService = dashboardService;

        


      [HttpGet]
    [EnableQuery()]
    [Route("api/dashboards/")]
    public IHttpActionResult Get()
    
        try
        
            var dashboards = _dashboardService.GetAllDashboards().AsQueryable();

             return Ok(dashboards);
        
        catch (Exception)
        
            return InternalServerError();
        
    

我也加了

config.EnableCors();

到 webapiconfig。

所以理论上这现在应该允许 cors? 它在 ie 中运行良好,但在 chrome 中没有。

因此另外在 web.config 中找到了对 OPTIONS 处理程序的引用,因此将其注释掉:

> <system.webServer>
>     <handlers>
>       <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
>       <!--<remove name="OPTIONSVerbHandler" />-->
>       <remove name="TRACEVerbHandler" />
>       <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
> preCondition="integratedMode,runtimeVersionv4.0" />
>     </handlers>   </system.webServer>

仍然没有喜悦。所以更多的挖掘导致在 global.asax 中添加以下内容:

protected void Application_BeginRequest()

    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    
        Response.Flush();
    

我发现的关于服务器端的一切我都试过了,但都不起作用,所以我假设它是客户端的东西。

Angular 应用使用 $resource 访问 api 并获取数据:

    function getAllDashboards() 
        var dashboards = $resource(appSettings.serverPath + 'api/dashboards/:id',  id: '@id' ).query();
        return dashboards;
    

我对 Angular 还是很陌生,但理解 $resource 是 $httpProvider 的包装器。然后,我只能找到有关 Angular 和 CORS 问题的内容:

  $httpProvider.defaults.useXDomain = true;
                delete $httpProvider.defaults.headers.common['X-Requested-With'];

我已经这样做了,仍然无法正常工作,但是我实际上并没有使用 $httpProvider,而是使用了 $resource。

我需要对 angular 和 $resource 做些什么来使其正常工作吗? 正如我所说,在 IE11 中它工作正常,在 fiddler 中观察数据正在 chrome 中检索,但只是返回错误:

XMLHttpRequest 无法加载 http://localhost:2773//api/dashboards。不 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:3419” 访问。

更新: 根据 vidalsasoon 的建议,它现在可以通过 Visual Studio (2012) 在 chrome 中运行,但在服务器上 (Windows 2008 R2 和 IIS7.5) 时仍然不能工作,即使仍在 IE 中工作

【问题讨论】:

【参考方案1】:

在发布 POST 之前,您不必担心 OPTIONS 部分。这是第 2 步。首先尝试执行 GET。

另一个测试是尝试将这些行添加到您的服务器 web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>

【讨论】:

这可以通过 Visual Studio 在本地运行,但仍然无法在 iis 上的服务器上运行。在 IE 中仍然可以正常工作,但是通过 chrome 在访问 api 时获得 401 未授权。 Fiddler 显示为:

401 - 未经授权:由于凭据无效,访问被拒绝。

您无权使用您提供的凭据查看此目录或页面。

以上是关于chrome 中的 Angularjs 应用程序中的 CORS 错误访问 .NET Web Api的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS - 在 Chrome 中选择文本触发父级中的 ng-click

不再支持AngularJS意味着应用程序将在Chrome中停止运行?

我可以将 chrome 扩展应用程序嵌入到我的主要 AngularJS 应用程序中吗?

AngularJS 的 Preflight OPTIONS 请求不适用于 Chrome?

使用 Django 和 CORS 的 AngularJS 应用程序中的 cookie 消失了

Chrome扩展程序(Angularjs)到Gmail附加组件(Appscript)