我有任何访问angular2
服务的asp.net core webapi
个应用。如果webapi iis配置是(Properties \ launchSettings.json):
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:12246/",
"sslPort": 0
}
},
但是,一旦WindowsAuthentication
为true
且AnonymousAuthentication为false
,它就会抛出错误。错误:
XMLHttpRequest无法加载 http://localhost:12246/api//values/getSettings。没有 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://localhost:4200” 访问。响应的HTTP状态代码为401。
请问好吗?
答案 0 :(得分:1)
您正在尝试制作跨源请求。这在CORS规范下是允许的,但需要配置。
解决此问题有三个步骤。
将两台Web服务器配置为使用Windows身份验证(并禁用匿名身份验证)。也就是说,必须配置托管Angular 2应用程序的服务器和托管ASP.NET Core WebAPI应用程序的服务器。
为您的ASP.NET核心WebAPI应用启用CORS:
在您的Startup.cs文件中:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseCors(builder =>
builder
.WithOrigins("http://localhost:4200") //<-- OP's origin
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
);
}
app.UseMvc();
}
让Angular 2发送您的凭据及其CORS请求:
import {Injectable} from '@angular/core'
import {Headers, Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class SomeAngularServiceThatCallsYourAPI{
constructor(private http: Http) { }
getApiData(): Promise<MyDataResult[]> {
var apiUrl = 'http://localhost:12246/api//values/getSettings';
return this.http.get(apiUrl,{
withCredentials: true
})
.toPromise()
.then(response => this.extractData(response) as MyDataResult[])
.catch(this.handleError);
}
}
有关详细信息,请参阅我的blog post。