IActionContextAccessor is Null - PullRequest
       36

IActionContextAccessor is Null

0 голосов
/ 26 сентября 2019

Я настраиваю пользовательское промежуточное ПО для моего .NET Core Application для регистрации ошибок исключений и имею следующие данные в Startup.cs для регистрации моих контекстов:

   services.AddHttpContextAccessor();
   services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

И в своей конфигурации я добавилследующее для использования пользовательского промежуточного программного обеспечения:

   app.UseMiddleware<CustomMiddleware>();

Мой пользовательский класс промежуточного программного обеспечения выглядит следующим образом:

 public class CustomMiddleware
 {
    private readonly RequestDelegate next;

    public CustomMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            this.BeginInvoke(context);
            await this.next.Invoke(context);
            this.EndInvoke(context);
        }
        catch(Exception ex)
        {
            //Capture the exception.
            string hostName = Environment.MachineName;
            string url = StringFunctions.getCurrentUrl(context);
            string userName = string.Empty;
            string controllerName = string.Empty;
            string actionName = string.Empty;

            //THIS IS NULL BELOW.
            IActionContextAccessor contextAccessor = context.RequestServices.GetService(typeof(IActionContextAccessor)) as IActionContextAccessor;
            RouteData routeData = contextAccessor.ActionContext.RouteData;

            if (context.User != null)
            {
                userName = context.User.Identity.Name;
            }

            if (routeData != null && routeData.Values != null)
            {
                controllerName = routeData.Values["controller"].ToString();
                actionName = routeData.Values["action"].ToString();
            }

            EventLogging.LogApplicationError(hostName, controllerName, actionName, url, userName, ex);
        }
    }

    private void BeginInvoke(HttpContext context)
    {
        //custom work here
    }

    private void EndInvoke(HttpContext context)
    {
        // Do custom work after controller execution
    }
}

Кажется, что 'contextAccessor', который я пытаюсь получить ActionContext.Значения RouteData от Null.

Что я делаю не так?Спасибо.

1 Ответ

1 голос
/ 26 сентября 2019

IActionContextAccessor.ActionContext не имеет значения вне области промежуточного программного обеспечения mvc.

Если все, что вас волнует в обработчике исключений, это MVC действия, вы создаете фильтр действий вместо промежуточного программного обеспечения для захвата и регистрации исключений.

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        //Capture the exception.
        string hostName = Environment.MachineName;
        string url = StringFunctions.getCurrentUrl(context.HttpContext);
        string userName = string.Empty;
        string controllerName = string.Empty;
        string actionName = string.Empty;

        if (context.HttpContext.User != null)
        {
            userName = context.HttpContext.User.Identity.Name;
        }

        controllerName = context.RouteData.Values["controller"].ToString();
        actionName = context.RouteData.Values["action"].ToString();

        EventLogging.LogApplicationError(hostName, controllerName, actionName, url, userName, ex);
    }
}
...