【问题标题】:How to handle custom exception in Asp.Net Core Web API in server如何在服务器的 Asp.Net Core Web API 中处理自定义异常
【发布时间】:2020-05-19 23:01:42
【问题描述】:

我有一个简单的 asp.net core 3.1 web api 应用程序和 CustomExceptionHandlerMiddleware。在我的本地计算机上一切正常,但是当我在 IIS api 下托管(inProcess 托管模型)我的项目时不会返回我的异常。这是示例代码:

    public async Task<string> PostTestAsync(TestRequest request)
    {
        if (request.Key == "exception")
        {
            throw new BusinessException(System.Net.HttpStatusCode.NotFound, "Post Test exception");
        }
        var response = await Task.Factory.StartNew(() =>
        {
            return $"Post {request.Key}";
        });
        return response;
    }

当我发送到 request.Key = "exception" 应用程序返回 "Connection ID "{ConnectionId}", Request ID "{TraceIdentifier}": An unhandled exception was throwed by the application."。

但是当我发送与“异常”不同时工作正常。

这是我的 CustomExceptionMiddleware:

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception exception)
        {
            _logger.LogError(exception, exception.Message);

            var code = exception is BusinessException ? (exception as BusinessException).StatusCode : HttpStatusCode.InternalServerError;
            httpContext.Response.ContentType = "application/json";
            httpContext.Response.StatusCode = (int)code;

            var apiResponse = new MyApiResponse
            {
                IsSuccess = false,
                ErrorResponse = new ErrorResponse
                {
                    Type = exception.GetType().ToString(),
                    StatusCode = (int)code,
                    Message = exception.Message,
                    StackTrace = exception.StackTrace
                }
            };

            var jApiResponse = JsonConvert.SerializeObject(apiResponse, new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });
            await httpContext.Response.WriteAsync(jApiResponse);
        }
    }

【问题讨论】:

    标签: asp.net-core exception iis .net-core asp.net-core-webapi


    【解决方案1】:

    我已经解决了这个问题。我的 Startup 课程是这样的:

    if(env.IsDevelopment())
        app.UseMyExceptionHandler();
    

    所以在服务器中;环境不是开发,当我抛出任何异常时,myMiddleware 没有捕获它并且应用程序返回 InternalServerError。我还添加了env.IsProduction() 条件,一切都解决了。

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 2016-12-02
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2023-02-10
      相关资源
      最近更新 更多