Почему я не могу обработать / перехватить статус ошибки http, когда 401?

Стек - Angular 5 -> .NET Core API. У меня есть некоторая обработка ошибок при вызове http.get, и хотя моя консоль браузера показывает 401 (Неавторизовано), статус ошибки равен 0. Что я здесь делаю не так? ...

getSearch(request:string) {

    return this.http.get<ProviderSearch>(request, options)
        .pipe(
            tap(_ => {
                console.info(`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 не реализован, появляется следующий ответ с ошибкой:

Failed to load http://localhost:62489/api/mysearch: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4202' is therefore not allowed access. The response had HTTP status code 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), заголовки (от fiddler) показывают 3 вызова:

Заголовки вызова №1 (204 ответа) (запрос и ответ):

ЗАПРОС:

OPTIONS /api/providersearch?&specialtyId=-1&providerTypeId=-1&regionId=-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&regionId=-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&regionId=-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&regionId=-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

Если бы мне пришлось угадывать, я бы сказал, что бэкэнд не отправляет заголовки CORS вместе с ответом об ошибке

user184994 24.05.2018 22:08

Сделал правку. Есть хорошие статьи / примеры? Возможно, мне нужно установить скрипач ...

Adam Cox 24.05.2018 22:39
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
2
139
0

Другие вопросы по теме