首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTP拦截器显示多条消息问题

HTTP拦截器显示多条消息问题
EN

Stack Overflow用户
提问于 2019-11-26 01:29:09
回答 1查看 53关注 0票数 1

在我的项目中(.net Core2.2+ angular 8).For显示一个错误HttpInterceptor,它工作得很完美,但对于多个消息,它也可以工作,但不能显示正确的错误消息。我得到了一些类似的东西:

代码语言:javascript
复制
[object Object] One or more validation errors occurred. 400 0HLRCTBS664E8:00000002

我的拦截器看起来像这样:

代码语言:javascript
复制
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).pipe(
            catchError(error => {
                if (error instanceof HttpErrorResponse) {
                    if (error.status === 401) {
                        return throwError(error.statusText);
                    }
                    const applicationError = error.headers.get('Application-Error');
                    if (applicationError) {
                        console.error(applicationError);
                        return throwError(applicationError);
                    }
                    const serverError = error.error;
                    let modalStateErrors = '';
                    if (serverError && typeof serverError === 'object') {
                        for (const key in serverError) {
                            if (serverError[key]) {
                                modalStateErrors += serverError[key] + '\n';
                            }
                        }
                    }
                    return throwError(modalStateErrors || serverError || 'Server Error');
                }
            })
        )
    }
}

export const ErrorInterceptorProvide = {
    provide: HTTP_INTERCEPTORS,
    useClass: ErrorInterceptor,
    multi: true
}

我使用的dto类:

代码语言:javascript
复制
    [Required(ErrorMessage = "username is required")]
    public string Username { get; set; }

    [Required(ErrorMessage = "password is required")]
    [StringLength(20, MinimumLength = 6, ErrorMessage = "Password should be between 6 and 20 
    characters")]
    public string Password { get; set; }

我的Startup类如下所示:

代码语言:javascript
复制
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler(builder =>
            {
                builder.Run(async context =>
                {
                    context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;

                    var error = context.Features.Get<IExceptionHandlerFeature>();
                    if (error != null)
                    {
                        context.Response.AddApplicationError(error.Error.Message);
                        await context.Response.WriteAsync(error.Error.Message);
                    }
                });
            });                
        }


        app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
        app.UseAuthentication();

        app.UseMvc();

    }
 }

应用程序错误扩展方法:

代码语言:javascript
复制
    public static class Extensions
    {
        public static void AddApplicationError(this HttpResponse response, string message)
        {
            response.Headers.Add("Application-Error", message);
            response.Headers.Add("Access-Control-Expose-Headers", "Application-Error");
            response.Headers.Add("Access-Control-Allow-Origin", "*");
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2019-11-26 01:42:26

在你的应用编程接口中,你似乎遇到了automatic 400 responses的问题。

避免它的最好方法是抑制这个错误。

若要禁用自动400行为,请将SuppressModelStateInvalidFilter属性设置为true。在Startup.ConfigureServices中添加以下突出显示的代码:

这是本文中包含的代码:

代码语言:javascript
复制
services.AddMvc()

.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.ConfigureApiBehaviorOptions(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true;
    options.SuppressMapClientErrors = true;
    options.ClientErrorMapping[404].Link =
        "https://httpstatuses.com/404";
});

微软的recommended way in github, is here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59037189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档