我正在运行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 wiki和sensenet 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!');
}
});
}
答案 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)