gpt4 book ai didi

c# - 如何在 WebApi 请求中获取 Controller 名称?

转载 作者:行者123 更新时间:2023-12-05 08:27:32 27 4
gpt4 key购买 nike

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

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

我一直在使用 HttpRequest 请求对象,但我似乎无法完全掌握我需要的东西。 (虽然Http请求的方法看起来很简单!!)

对于 Authorization header ,我认为它会像“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);
}
}
}
}

最佳答案

您应该为日志记录实现一个操作过滤器。这样您就可以通过HttpActionContext 参数访问 Controller 名称

API Controller :

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

过滤器:

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

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
}
}

您可以使用 [Logger] 装饰每个需要记录的方法,或者在 Controller 级别进行,以记录该 Controller 内发生的每个调用。最后,您可以将操作过滤器设置为全局过滤器,这样每次在您的项目中调用任何操作时它都会运行。

关于c# - 如何在 WebApi 请求中获取 Controller 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com