【问题标题】:Controller and Action from Global Error Handler来自全局错误处理程序的控制器和操作
【发布时间】:2020-02-08 06:05:20
【问题描述】:

我正在将 Web api 从 .Net 迁移到 .NetCore。

我们有一个自定义的 ExceptionFilterAttribute 来集中处理错误。像这样的:

public class HandleCustomErrorAttribute : ExceptionFilterAttribute
{
   public override void OnException(HttpActionExecutedContext filterContext)
   {
     // Error handling routine
   }
}

通过一些搜索,我设法在 .Net Core 上创建了类似的东西

public static class ExceptionMiddlewareExtensions
    {
        public static void ConfigureExceptionHandler(this IApplicationBuilder app)
        {
            app.UseExceptionHandler(appError =>
            {
                appError.Run(async context =>
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    context.Response.ContentType = "application/json";

                    var contextFeature = context.Features.Get<IExceptionHandlerFeature>();
                    if (contextFeature != null)
                    {
                        //logger.LogError($"Something went wrong: {contextFeature.Error}");

                        await context.Response.WriteAsync(new ErrorDetails()
                        {
                            StatusCode = context.Response.StatusCode,
                            Message = "Internal Server Error."
                        }.ToString());
                    }
                });
            });
        }
    }

我需要找到一种方法来访问 .Net Core 版本中的 .Net 中可用的这 3 个信息:

filterContext.ActionContext.ActionDescriptor.ActionName;
filterContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
HttpContext.Current.Request.Url.ToString();

有可能吗?

【问题讨论】:

标签: asp.net-core error-handling asp.net-core-webapi


【解决方案1】:

对于注册ExceptionFilter和获取请求路径的完整解决方案,您可以尝试

  1. ExceptinoFilter

    public class ExceptinoFilter : IExceptionFilter
    {
            public void OnException(ExceptionContext context)
            {
            string controllerName = context.RouteData.Values["controller"].ToString();
            string actionName = context.RouteData.Values["action"].ToString();
            var request = context.HttpContext.Request;
            var requestUrl = request.Scheme + "://" + request.Host + request.Path;
            }
    }
    
  2. 注册

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews(options => {
            options.Filters.Add(new ExceptinoFilter());
        });
    }
    

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多