在我的ASP.NET MVC应用程序中,我有自定义过滤器,它标记了每个请求:
public class GuidToRequestAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Session["GuidSessionsId"] = Guid.NewGuid().ToString();
base.OnActionExecuting(filterContext);
}
}
我需要它来记录用户的操作。如果http-request是数据库中多次更改的原因,则所有日志行都具有相同的GUID,并且很容易读取此类日志。
我的完整ASP.NET WEB API需要相同的功能。
如何在不使用WEB API中的Session对象的情况下执行此操作?
更新: 在我的mvc部分中,我在自定义服务中检索guid,如下所示:
public class LogService
{
private LogRow CreateLogRow()
{
var sessionId = HttpContext.Current.Session["GuidSessionsId"].ToString();
}
}
我需要这样的东西,但是对于WEB API。
我尝试了这个并且它不起作用:
public class GuidToWebApiRequestAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
actionContext.Request.Headers.Add("GuidSessionsId", Guid.NewGuid().ToString());
base.OnActionExecuting(actionContext);
}
}
public class LogService
{
private LogRow CreateLogRow()
{
var sessionId = HttpContext.Current.Request.Headers["GuidSessionsId"].ToString();
}
}
解: 我不明白这里到底发生了什么。我只是通过调查DebugMode中的HttpConext.Current找到了我的标题存储位置
public class LogService
{
private LogRow CreateLogRow()
{
string sessionId=null;
var httpRequestMessage = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
if (httpRequestMessage != null)
{
var httpRequestHeaders = httpRequestMessage.Headers;
sessionId = httpRequestHeaders.GetValues("X-Request-Guid").Last();
}
}
}
答案 0 :(得分:1)
您可以尝试使用自定义标头将其添加到Http标头。
filterContext.HttpContext.Response.Headers.Add("X-Request-Guid",Guid.NewGuid().ToString());
//or
filterContext.HttpContext.Request.Headers.Add("X-Request-Guid",Guid.NewGuid().ToString());
取决于您真正想要记录的内容。
编辑:
获取可以使用的日志:
filterContext.HttpContext.Request.Headers["X-Request-Guid"].ToString())