如何在WebApi请求中获取控制器名称?

Jas*_*ood 0 .net c# asp.net asp.net-web-api

我在WebApi项目中使用了logging.cs类来记录有关传入请求的信息。

该类是从Global.asax中的Application_BeginRequest()方法触发的。 我需要在请求中获取Controller名称和Authorization标头。怎么做 ?

我一直在使用HttpRequest Request对象,但是似乎无法充分利用我真正需要的东西。(尽管Http请求的方法似乎很简单!!)

对于Authorization标头,我认为它就像“ Request.Headers [” Authorization“];”一样简单。但是,当前返回为null。

我的代码在下面,任何方向或建议将不胜感激。-杰森

namespace WCAPI.BLL
{
    public class logging_2
    {
        private static HttpRequest Request
        {
            get { return HttpContext.Current.Request; }
        }

        private static HttpResponse Response
        {
            get { return HttpContext.Current.Response; }
        }

        public static void LogWcapiRequest(BLL.DebugTmr tmr)
        {
            if (tmr.EventType == DebugTmr.EventTypes.Null) { return; }

            try
            {
                Services.AFSILog log = new Services.AFSILog();
                log.Level = Services.LogLevels.Info;
                log.SourceSystem = ANACore.AMTConfig.GetConfigurationValue("ConsoleLogSourceSystem");
                if (Request.Url.IsLoopback) { log.SourceSystem += "_" + System.Environment.MachineName; }
                log.Stamp = DateTime.Now;
                log.Message = tmr.FormatedMsg;
                log.Category = tmr.EventType.ToString();


                List<Services.LogData> dets = new List<Services.LogData>();
                dets.Add(new Services.LogData { DataType = Services.ParameterDataTypes.Int, DataKey = "Duration", DataValue = tmr.ElapsedMs.ToString() });

                //This appears to be easy!! 
                var meth = Request.HttpMethod;
                dets.Add(new Services.LogData { DataType = Services.ParameterDataTypes.Int, DataKey = "Method", DataValue = meth });

                //Now how do I get Authorization Header and Controller name ?


                foreach (BLL.DebugTmr.Waypoint wp in tmr.Waypoints)
                {
                    dets.Add(new Services.LogData
                    {
                        DataType = Services.ParameterDataTypes.Int,
                        DataKey = wp.Name + "Ms",
                        DataValue = wp.ElapsedMs.ToString()
                    });
                }

                log.Parameters = dets.ToArray();
                // This is what actually writes to the log I just need add Authorization header and Controller name to my log object
                SaveLog(log);
            }
            catch (Exception ex)
            {
                Debug.Print("Page log create failed : {0}", ex.Message);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Den*_*els 5

您应该实现一个用于记录日志的操作过滤器,这样您就可以通过HttpActionContext参数访问控制器名称

Api控制器:

public class LeadsController : ApiController
{
    [Logger]
    public List<string> Get()
    {
        return new List<string> { "Lead 1", "Lead 2", "Lead 3", "Lead 4","Lead 5" };
    }
}
Run Code Online (Sandbox Code Playgroud)

过滤:

public class Logger : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        string controllerName = 
            actionContext.ControllerContext.ControllerDescriptor.ControllerName;
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以装饰每个需要记录的方法,[Logger]也可以在控制器级别进行处理,以记录发生在该控制器内部的每个调用。最后,可以使操作过滤器成为全局过滤器,以便每次在项目中调用任何操作时都可以运行该过滤器。


Ale*_*key 5

与Sin的答案类似,但针对 ASP.Net Core 3.1:

var myControllerName = ControllerContext.ActionDescriptor.ControllerName;
Run Code Online (Sandbox Code Playgroud)