通过GUID标记请求

时间:2014-08-04 09:45:57

标签: asp.net-mvc asp.net-web-api

在我的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();
                    }
                }
             }

1 个答案:

答案 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())