Код ответа для успеха не обрабатывается в угловых - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь обработать коды ошибок, выдаваемые приложением asp.net web api.Он работает нормально, тогда запись существует и выдается код ошибки 409, но не работает, если в случае успеха выдается код ответа 200.Точка отладки никогда не попадает в блок catch в случае успеха, а объект результата в методе save равен null и, следовательно, не запускается внутри блока if (result).Как отобразить сообщение об успехе?Ранее мой веб-интерфейс asp.net возвращал IHttpActionResult и блок if (result) выполнялся в случае успеха.

Веб-интерфейс Asp.net

[HttpPost]
        [SkipTokenAuthorization]
        [Route("api/classificationoverrides/create")]
        public HttpResponseMessage Create(ClassificationItemViewModelCreate model)
        {
            HttpResponseMessage response;

            var mgrClassificationService = GetService<MGR_STRT_CLASSIFICATION>();

            var isExists = mgrClassificationService.Where(x =>
                x.MANAGERSTRATEGYID == model.ManagerStrategyId && x.PRODUCT_ID == model.ProductId).FirstOrDefault();

            if (isExists == null)
            {
               var mgrClassficationOverride = new MGR_STRT_CLASSIFICATION();
                if (model != null)
                {
                    mgrClassficationOverride.PRODUCT_ID = model.ProductId;
                    mgrClassficationOverride.LEGACY_STRATEGY_ID = model.LegacyStrategyId;
                    mgrClassficationOverride.STRATEGY_ID = model.StrategyId;
                    mgrClassficationOverride.MANAGERSTRATEGY_TYPE_ID = model.ManagerStrategyTypeId;
                    mgrClassficationOverride.MANAGERSTRATEGYID = model.ManagerStrategyId;

                    mgrClassficationOverride = mgrClassificationService.Create(mgrClassficationOverride);
                }
                response = Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                 response = Request.CreateResponse(HttpStatusCode.Conflict, "The item already exists");
            }

            return response;
        }

Angular

Save() {

        if (this.ClassificationOverrideDetails.ClassificationEntities.ID === 0) {
            this.Error = '';
            this.classificationOverrideService
                .createClassificationOverrideDetails(this.ClassificationOverrideDetails.ClassificationEntities)
                .then((result) => {
                    if (result) {
                        this.ClassficationOverrideDetailsEvent.next('init');
                        this.notify.success('Classification Overrides Successfully Created');
                    }
                }).catch(err => {
                    if (err.status === 200) {
                        this.notify.error('Classification Overrides Successfully Created');
                    } else if (err.status !== 409) {
                        this.notify.error('An Error Has Occured While Updating Classification Overrides Details');
                    } else if (err.status === 409) {
                        this.notify.error('Product already exists for this Manager Strategy');
                    }
                });
        } 

Служба

import { defer as observableDefer } from 'rxjs';
import { refCount, publishReplay } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { Response, URLSearchParams, RequestOptionsArgs, Headers, RequestOptions, ResponseContentType } from '@angular/http';
import { AppConfig } from '../app.config';
import { Observable } from 'rxjs/Rx';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Manager360CommonService } from './mgr360.common.service';
import { IClassificationOverride } from '../classification-overrides/classification-override.interface';


@Injectable()
export class ClassificationOverrideService {

        constructor(
                private mgr360CommonService: Manager360CommonService
        ) { }


        getClassificationOverrideDetails(mgrStrategyId: number) {
                return this.mgr360CommonService.httpGet('/api/classificationoverrides/Details/' + mgrStrategyId);
              }

        getClassificationDetails(Id: number) {
                return this.mgr360CommonService.httpGet('/api/classificationoverrides/classificationdetails/' + Id);
              }


        updateClassificationOverrideDetails(classificationOverride: IClassificationOverride) {
                return this.mgr360CommonService.httpPut('/api/classificationoverrides/update', JSON.stringify(classificationOverride));
            }

        createClassificationOverrideDetails(classificationOverride: IClassificationOverride) {
               return this.mgr360CommonService.httpPostAsync('/api/classificationoverrides/create', JSON.stringify(classificationOverride));
            }

        deleteClassificationOverrideDetails(Id: number) {
                return this.mgr360CommonService.httpDelete('/api/classificationoverrides/delete/' + Id);
             }

}

Общая служба

   import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { RequestOptions } from '@angular/http';
import { Options } from 'selenium-webdriver/firefox';
import { NotifyService } from '../utilities/notify.service';

const httpPostOptions = {

    headers:
        new HttpHeaders(
            {
                'Content-Type': 'application/json; charset=utf-8',
            }),
    withCredentials: true,
};

@Injectable({
    providedIn: 'root'
})
export class Manager360CommonService {

    webApiLocation = this.getApiLocation();

    private getApiLocation() {
        const port = location.port ? ':56888' : '';
        return location.protocol + '//' + location.hostname + port;
    }

    constructor(private httpClient: HttpClient) { }

     httpGetAsync(url: string) {

            return this.httpClient.get(this.webApiLocation + url, httpPostOptions)
                .pipe(map((response: Response) => {
                    return response;
                }))
                .toPromise()
                .catch((error: any) => {
                    this.onError(error);
                    return Promise.reject(error);
                });
        }
}

1 Ответ

0 голосов
/ 25 апреля 2019

Ваше приложение не будет запускать код из функции catch, если вы получите ответ со статусом ответа 2xx.

Если вы хотите показать сообщение, если вы получите 2xx нужный вам ответпоместить

this.notify.success('Classification Overrides Successfully Created');

вне блока if(result).

Если вы хотите показать сообщение в зависимости от успешного кода состояния (2xx), вы должны отправить запрос сзапросить опцию {observe: 'response'}, а затем проверить код состояния в then функция

Это код для первого случая:

Save() {

        if (this.ClassificationOverrideDetails.ClassificationEntities.ID === 0) {
            this.Error = '';
            this.classificationOverrideService
                .createClassificationOverrideDetails(this.ClassificationOverrideDetails.ClassificationEntities)
                .then((result) => {
                    this.notify.success('Classification Overrides Successfully Created');
                    if (result) {
                        this.ClassficationOverrideDetailsEvent.next('init');

                    }
                }).catch(err => {
                    if (err.status !== 409) {
                        this.notify.error('An Error Has Occured While Updating Classification Overrides Details');
                    } else if (err.status === 409) {
                        this.notify.error('Product already exists for this Manager Strategy');
                    }
                });
        } 
...