不应用跨源资源共享设置

时间:2018-01-23 14:45:19

标签: angular cross-domain sensenet

我正在运行SenseNet 7.0.0,使用ASP.NET 5.2.3运行它,我正在尝试从Angular(Typescript)应用程序运行api调用。 Angular应用程序在localhost:4200上运行,ASP.NET应用程序在localhost:55064上运行。我跟着this tutorial安装了Sensenet,并使用this tutorial安装了WebPages。

当我运行api调用时,我收到此错误:

The 'Access-Control-Allow-Origin' header has a value 'http://localhost:55064' that is not equal to the supplied origin. Origin 'http://localhost:4200' is therefore not allowed access.

在Content Explorer中,我导航到Root / System / Settings / Portal.settings。在设置中,我将下一个代码添加到文件的底部:

,
AllowedOriginDomains: [ "http://localhost:4200", "http://localhost:55064/" ]

我还尝试使用[ "*" ][ "localhost" ]而不是两个本地主机。 Here是portal.properties文件的屏幕截图。我没有忘记在更改值后单击“保存”按钮。我预计这会解决问题,但事实并非如此。即使it should not involve a restart,我也尝试重新启动asp.net项目和服务器。这也没有解决问题。我尝试了这些解决方案,因为sensenet wikisensenet docs表示应将外部应用程序的网址添加到AllowedOriginDomains以将其列入白名单。

如何解决上面的错误,当我尝试使用外部程序访问API时,我会得到错误?

我认为Angular调用不是问题,只是以防万一:

导入声明:

import {HttpClient} from '@angular/common/http';

HttpClient注入:

constructor(private http: HttpClient) {
}

Angular api电话:

testApiCall() {
  this.http.post(
    Configuration.ServerWithApiUrl + '/Odata.svc/(\'Root\')/Login?metadata=no',
    '"username" : "admin", "password" : "admin"')
    .subscribe(data => this.callResult = data);
}

这是错误了一次:

The 'Access-Control-Allow-Origin' header has a value 'http://localhost:55064' that is not equal to the supplied origin. Origin 'http://localhost:4200' is therefore not allowed access.

这是一个从localhost:55064上的asp.net项目运行的ajax调用。这显示了成功的信息。 当我从一个独立的html文件运行它时,它还显示了成功消息。当我从独立文件运行它时显示错误。在错误而不是“localhost:4200”中,它显示“null”。

function testLoginCall() {
    $.ajax({
        url: "/Odata.svc/('Root')/Login?metadata=no",
        dataType: "json",
        type: 'POST',
        data: JSON.stringify({
            'username': "admin",
            'password': "admin"
        }),
        success: function (d) {
            console.log('You are logged in!');
        }
    });
}

4 个答案:

答案 0 :(得分:1)

"localhost"添加到设置文件中的允许来源列表中,不带协议和端口

答案 1 :(得分:1)

事实证明这是Sensenet 7.0.0中的错误或限制。您可以看到状态here

目前,解决方法是build the Angular project使用ng build --base-href=~/Scripts/Angular并将dist文件夹的内容粘贴到ASP.NET项目的/Scripts/Angular文件夹中。然后,将_Layout.cshtml文件的内容替换为dist文件夹中index.html文件的内容,将@RenderBody()放回_Layout.cshtml并运行ASP .NET项目

这两个api调用现在都可以使用解决方法:

testLoginApiCall() {
  this.http.post(
    Configuration.ServerWithApiUrl + '/Odata.svc/(\'Root\')/Login?metadata=no',
    '{"username" : "admin", "password" : "admin"}')
    .subscribe(
      data => console.log('Succes!', data),
      error => console.log('An error occured.', error));
}

testCreateWorkspaceCall() {
  this.http.post(
    Configuration.ServerWithApiUrl + 'OData.svc/(\'Root\')',
    'models=[{"__ContentType": "Workspace", "DisplayName": "Workspace"}]')
    .subscribe(
      data => console.log('Succes!', data),
      error => console.log('An error occured.', error));
}

答案 2 :(得分:0)

我认为您的请求与标题或方法(POST,GET,PUT等)不匹配

以你的方式尝试这个或类似的东西。
[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]

答案 3 :(得分:0)

正如Miklós所说,其中一个网站的网址应该与localhost不同。我做了一个快速测试,它没有https工作,所以步骤如下:

  1. 转到IIS管理器并创建一个新站点。将sensenet安装的web文件夹的路径添加为物理路径,并添加除localhost之外的主机名。
  2. enter image description here

    1. 将自定义主机名添加到主机文件(\ Windows \ System32 \ drivers \ etc \ hosts)

    2. 打开sensenet的管理界面(又名内容资源管理器)并将此新网址添加到Default_Site的urllist(如果您编辑网站内容,则可以修改列表)

    3. enter image description here

      通过以上步骤,我设法解决了CORS错误。