我一直在搜索解决方法,并且看到了一些例子,当我们在控制器操作中返回错误文本时,可以使用ActionResult
/JsonResult
或使用以下HttpRequest
方法:
HttpContext.Current.Response.Status = "error text";
我的后端应用程序使用 ASP.NET Core 2.1.1
,但是HttpResponse
类中缺少.Status
属性。
此外,我无法找到任何可以包含自定义错误消息的属性。
我使用中间件类获取异常描述并将其作为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错误(否则在Angular拦截器中.catch(...)
块将不会被触发)。以下是我的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(...)
确实会返回异常信息,但我无法在拦截器的.catch(...)
块中提取它。
public handleError = (error: Response) => {
这里是将
error
以JSON
格式输出的结果(请注意,没有显示错误信息“Last Entry”)。{
"headers":{
"normalizedNames":{
},
"lazyUpdate":null
},
"status":500,
"statusText":"OK",
"url":"https://localhost:44305/api/Entry/GetNext?id=11962",
"ok":false,
"name":"HttpErrorResponse",
"message":"Http failure response for https://localhost:44305/api/Entry/GetNext?id=11962: 500 OK",
"error":{
}
}
然而,如果我打开Chrome的 网络 选项卡,我可以看到以下内容:
所以,我似乎无法从 error: Response
中获取此错误文本。
也许,有人知道更好的方法将错误传递给Angular客户端并在那里获取它?
更新1 - 错误处理程序(我只是为了调查错误内容在那里设置断点)
public handleError = (error: Response) => {
debugger
return Observable.throw(error)
}
error.error
你应该能够获取到响应体。 - Daviderror.body.getReader().read().then(...)
部分(刚刚发现它)。 - Alex HermanHttpErrorResponse
- 它不适用于Angular 6,这个(Response
)似乎是新的,而且接口本身可以在lib.dom.d.ts中找到。 - Alex Herman