Angular:无法通过 HttpResponse 返回自定义错误消息

我一直在谷歌搜索解决方法并看到我们在控制器操作中作为ActionResult/JsonResult或使用HttpRequest如下方法返回错误文本时的示例


HttpContext.Current.Response.Status = "error text";

对于我的后台应用程序,我使用ASP.NET Core 2.1.1和.Status属性在缺少HttpResponse类。


此外,我找不到任何可能包含我的自定义错误消息的属性。


我使用中间件类,它获取异常描述并将其作为 JSON


Startup.cs


app.UseMiddleware<ExceptionHandleMiddleware>();

班级本身


public class ExceptionHandleMiddleware

{

    private readonly RequestDelegate next;


    public ExceptionHandleMiddleware(RequestDelegate next)

    {

        this.next = next ?? throw new ArgumentNullException(nameof(next));

    }


    public async Task Invoke(HttpContext context)

    {

        try

        {

            await next(context);

        }

        catch (Exception ex)

        {

            context.Response.Clear();

            context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

            context.Response.ContentType = "application/json";

            context.Response.StatusCode = StatusCodes.Status500InternalServerError;


            await context.Response.WriteAsync(JsonConvert.SerializeObject(new { error = $"{ex.GetType().FullName}: '{ex.Message}'" }));

        }

    }

}

看看行


context.Response.StatusCode = StatusCodes.Status500InternalServerError;

这是必需的,因为在我的Angular 6 应用程序中,我使用HttpInterceptor,并且为了捕获错误,您应该返回一个 HTTP 错误(否则.catch(...)在 Angular 拦截器中不会触发该块)。


这是我的 Angular 应用程序中的一点


@Injectable()

export class ErrorHandlerInterceptor implements HttpInterceptor {


    constructor(

        private notify: NgNotify,

    ) { }


    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next

            .handle(req)

            .catch(this.handleError)

    }

    ...

尽管context.Response.WriteAsync(...)bit确实返回了异常文本,但我无法.catch(...)在拦截器的块中提取它。

http://img2.mukewang.com/617e9115000162ec05700148.jpg

所以,我似乎无法从error: Response.

也许,有人知道将错误传递给 Angular 客户端并在那里获取它的更好方法?



喵喵时光机
浏览 533回答 2
2回答

慕桂英3389331

我的疏忽。如果您查看返回的 JSON&nbsp; ....&nbsp; "message":"Http failure response for https://localhost:44305/api/Entry/GetNext?id=11962: 500 OK",&nbsp; "error":{&nbsp;&nbsp;&nbsp; }}error似乎是一个空对象代替事实上error是Blob,我们应该以下面的方式阅读intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {&nbsp; &nbsp; return next&nbsp; &nbsp; &nbsp; &nbsp; .handle(req)&nbsp; &nbsp; &nbsp; &nbsp; .catch(this.handleError)}public handleError = (error: Response) => {&nbsp; &nbsp; let reader = new FileReader();&nbsp; &nbsp; let ngNotify = this._ngNotify;&nbsp; &nbsp; reader.onload = function () {&nbsp; &nbsp; &nbsp; &nbsp; var result = JSON.parse(this.result);&nbsp; &nbsp; &nbsp; &nbsp; ngNotify.nofity('Error', result.error);&nbsp; &nbsp; };&nbsp; &nbsp; reader.readAsText(error['error']);&nbsp; &nbsp; return Observable.throw(error)}就是这样。

茅侃侃

我最终通过实现中间件来拦截HttpResponse、从 blob 中提取错误并在 json 中返回消息来解决这个问题。感谢JaapMosselman 的贡献。
打开App,查看更多内容
随时随地看视频慕课网APP