Стек - Angular 5 -> .NET Core API.У меня есть некоторая обработка ошибок при вызове http.get, и хотя консоль моего браузера показывает 401 (неавторизовано), состояние ошибки равно 0. Что я здесь не так делаю? ...
getSearch(request:string) {
return this.http.get<ProviderSearch>(request, options)
.pipe(
tap(_ => {
console.log(`MyDataService: ${endpointPath}`);
}),
catchError(this.apiErrorService.handleError<MyDataSearchResponse>(`GET ${endpointPath}`)),
);
}
public handleError<T> (operation = 'operation', pushNotify: boolean = false, result?: T) {
return (error: any): Observable<T> => {
console.error(`**** ERROR: ${JSON.stringify(error)}`); // log to console instead
throw(error || 'Server error');
};
}
Program.cs:
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostContext, logging) =>
{
logging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
//.UseIISIntegration()
//.UseKestrel()
.UseStartup<Startup>()
.Build();
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
// other configs
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
// other configs
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("AllowAll");
app.UseMvc();
}
Если CORS не реализован, выдается следующее сообщение об ошибке:
Не удалось загрузить http://localhost:62489/api/mysearch: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».Происхождение 'http://localhost:4202' поэтому не разрешено.Ответ имеет HTTP-код состояния 404.
launchSettings.json
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:62489/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/provider",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Console": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Когда я звоню с клиента (Angular), заголовки (из фиддлера) показывают 3 звонка:
Заголовок вызова № 1 (204 ответа) (запрос и ответ):
ЗАПРОС:
OPTIONS /api/providersearch?&specialtyId=-1&providerTypeId=-1®ionId=-1&cityId=-1&organizationId=-1&pageStart=1&pageSize=5 HTTP/1.1
Host: localhost:62489
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:4202
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
ОТВЕТ:
HTTP/1.1 204 No Content
Vary: Origin
Server: Kestrel
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Origin: http://localhost:4202
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcYWNveFxzb3VyY2VccmVwb3NcY21uLnByb3ZpZGVyLmRhdGFcY21uLnByb3ZpZGVyLmFwaVxhcGlccHJvdmlkZXJzZWFyY2g=?=
X-Powered-By: ASP.NET
Date: Thu, 24 May 2018 20:50:21 GMT
ВызовЗаголовки # 2 (ответ 401) (запрос и ответ):
ЗАПРОС:
GET /api/providersearch?&specialtyId=-1&providerTypeId=-1®ionId=-1&cityId=-1&organizationId=-1&pageStart=1&pageSize=5 HTTP/1.1
Host: localhost:62489
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: http://localhost:4202
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
Content-Type: application/json
Referer: http://localhost:4202/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
ОТВЕТ:
HTTP/1.1 401 Unauthorized
Vary: Origin
Server: Kestrel
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4202
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcYWNveFxzb3VyY2VccmVwb3NcY21uLnByb3ZpZGVyLmRhdGFcY21uLnByb3ZpZGVyLmFwaVxhcGlccHJvdmlkZXJzZWFyY2g=?=
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Thu, 24 May 2018 20:50:21 GMT
Content-Length: 0
Proxy-Support: Session-Based-Authentication
Заголовок вызова № 3 (ответ 401) (запрос и ответ):
ЗАПРОС:
GET /api/providersearch?&specialtyId=-1&providerTypeId=-1®ionId=-1&cityId=-1&organizationId=-1&pageStart=1&pageSize=5 HTTP/1.1
Host: localhost:62489
Connection: keep-alive
Authorization: Negotiate YHcGBisGAQUFAqBtMGugMDAuBgorBgEEAYI3AgIKBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHqI3BDVOVExNU1NQAAEAAACXsgjiAwADADIAAAAKAAoAKAAAAAoAqz8AAAAPR0dIUy1MMDAxNkNNTg==
Accept: application/json, text/plain, */*
Origin: http://localhost:4202
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
Content-Type: application/json
Referer: http://localhost:4202/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
ОТВЕТ:
HTTP/1.1 401 Unauthorized
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate oYH8MIH5oAMKAQGhDAYKKwYBBAGCNwICCqKB4wSB4E5UTE1TU1AAAgAAAAYABgA4AAAAFcKJ4plNUkS82EIzcAQlUHsBAACiAKIAPgAAAAoAqz8AAAAPQwBNAE4AAgAGAEMATQBOAAEAFABHAEcASABTAC0ATAAwADAAMQA2AAQAGgBjAGEAbgBtAGUAZABuAGUAdAAuAGMAbwBtAAMAMABHAEcASABTAC0ATAAwADAAMQA2AC4AYwBhAG4AbQBlAGQAbgBlAHQALgBjAG8AbQAFABoAYwBhAG4AbQBlAGQAbgBlAHQALgBjAG8AbQAHAAgAEawP1aDz0wEAAAAA
Date: Thu, 24 May 2018 20:50:21 GMT
Content-Length: 341
Proxy-Support: Session-Based-Authentication
Вызов № 4 (200 ответов) заголовков (запрос и ответ):
ЗАПРОС:
GET /api/providersearch?&specialtyId=-1&providerTypeId=-1®ionId=-1&cityId=-1&organizationId=-1&pageStart=1&pageSize=5 HTTP/1.1
Host: localhost:62489
Connection: keep-alive
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIKAKs/AAAADxTu/MxIVvwagppbuHaQldKjEgQQAQAAALv5rPHqFBetAAAAAA==
Accept: application/json, text/plain, */*
Origin: http://localhost:4202
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
Content-Type: application/json
Referer: http://localhost:4202/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
ОТВЕТ:
HTTP/1.1 200 OK
Cache-Control: public,max-age=30
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4202
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcYWNveFxzb3VyY2VccmVwb3NcY21uLnByb3ZpZGVyLmRhdGFcY21uLnByb3ZpZGVyLmFwaVxhcGlccHJvdmlkZXJzZWFyY2g=?=
Persistent-Auth: true
X-Powered-By: ASP.NET
WWW-Authenticate: Negotiate oRswGaADCgEAoxIEEAEAAACBDX3/vTx/zQAAAAA=
Date: Thu, 24 May 2018 20:50:25 GMT