【问题标题】:Understanding CORS handling for external service in Angular2了解 Angular2 中外部服务的 CORS 处理
【发布时间】:2016-08-27 21:23:32
【问题描述】:

我遇到了一种情况,我试图从外部 URL ('http://knowstack.com/webtech/charts_demo/data.json') 获取数据

如果是 Angular2,我会收到 CORS 错误。据我了解,CORS 需要在服务端启用,而不是在 Angular2 应用程序中启用。

但我没有访问服务端。因此,这是无法做到的。

现在,如果我将前端从 Angular2 更改为 ASP.NET MVC 核心 UI 并使用 System.Net.Http 命名空间的 httpClient 类。我确实收到了回复和数据。

我想知道这在 ASP.NET MVC 核心 UI 中是如何工作的,而 Angular2 前端给了我 CORS 错误。 如何在Angular2中克服这种外部服务CORS场景?

以下是我的两个案例以及代码-

案例 1:Angular2

在此,我使用 Angular2 版本 RC4 和 npm 版本 3.9.6,节点版本 4.4.7。浏览器chrome,编辑器:VScode

要执行应用程序,我只是使用“npm start”命令。

        this._http.get('http://knowstack.com/webtech/charts_demo/data.json')
                .map(this.extractData)
                .subscribe((response) => {
                    this.options11 = {
                                    title : { text : 'knowstack' },
                                    series : [{
                                        name : 'knowstack',
                                        data : response.json()
                                    }]
                                };
                },
                (error) => { 
                    this.errorMessage = <any>error
                });

浏览器控制台出错:

案例 2:ASP.NET MVC core 1.0,浏览器 chrome,IDE:VS 社区 2015

    public IActionResult Index()
    {
           string GET_DATA_URL = "http://knowstack.com/webtech/charts_demo/data.json";

            HttpClient client1 = new HttpClient();
            client1.BaseAddress = new Uri(GET_DATA_URL);

            client1.DefaultRequestHeaders.Accept.Clear();
            client1.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response1 = client1.GetAsync(GET_DATA_URL).Result;

            if (response1.IsSuccessStatusCode)
            {
                var dataObjects = response1.Content.ReadAsStringAsync().Result;

                var rootObj = JsonConvert.DeserializeObject<dynamic>(dataObjects);

            }
            else
            {
                // handle failure response
            }
        return View();
    }

如果您需要我方面的任何信息,请告诉我。

【问题讨论】:

    标签: angular


    【解决方案1】:

    我猜 ASP.NET 代码在您的服务器上执行,然后服务器将 HTML 返回给您。

    CORS 是一种内置于浏览器的技术。浏览器阻止网站对不允许从外部访问的外部网站进行 AJAX 调用。因为在 ASP.NET 的情况下,此请求是由您的后端完成的。因为对于后端,这是一个普通的 HTTP 请求(就像您使用浏览器所做的那样),它不需要检查 CORS。因此,请求也不会发送“origin”标头。 CORS 仅用于防止来自外部主机的 AJAX 调用。

    要在 Angular2 中实现这项工作,您可以做的是在您的域上创建一个代理,该代理只是绕过对外部服务的请求,并且就像请求发生在您的站点上一样,因此不需要 CORS。

    【讨论】:

    • 感谢您的回复。您能否提供一些关于如何在我的域上创建代理的指示?
    • 您使用的是什么网络服务器?阿帕奇? nginx?
    • 对于开发,我使用 lite-server,如 angular2 快速入门教程所示。
    • 好的,我不知道如何使用这个 lite-server,但这里有一个解决代理问题的 GitHub 问题:github.com/johnpapa/lite-server/issues/61 也许有帮助
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 2019-05-13
    • 2016-08-09
    • 2019-07-20
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多