Asp.Net MVC每个请求的唯一ID

问题描述:

在我们的MVC 5网站中,没有会话,我们需要为每个请求获取/生成唯一的ID。这将被用作记录请求中所有活动的ID。Asp.Net MVC每个请求的唯一ID

有没有一种方法来分配/获取值的请求来启用它?

+0

[ASP.NET中的log4net唯一请求ID]可能的重复(http://*.com/questions/15842321/log4net-unique-request-id-in-asp-net) – 2016-05-18 21:07:37

将它添加到该请求项集合odetocode.com/articles/111.aspx

Guid.NewGuid() 

会生成一个唯一的ID。

http://msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx

+1

但是,我如何附加它发送到请求,以便在请求的整个生命周期内都可以访问它。 – 2014-10-09 22:16:13

+3

将它添加到请求项目集合http://odetocode.com/articles/111.aspx – TGH 2014-10-09 22:17:37

下面是我为这个目的而创建的一些推广方法:

public static Guid GetId(this HttpContext ctx) => new HttpContextWrapper(ctx).GetId(); 

public static Guid GetId(this HttpContextBase ctx) 
{ 
    const string key = "tq8OuyxHpDgkRg54klfpqg== (Request Id Key)"; 

    if (ctx.Items.Contains(key)) 
     return (Guid) ctx.Items[key]; 

    var mutex = string.Intern($"{key}:{ctx.GetHashCode()}"); 
    lock (mutex) 
    { 
     if (!ctx.Items.Contains(key)) 
      ctx.Items[key] = Guid.NewGuid(); 

     return (Guid) ctx.Items[key]; 
    } 
} 

更新

@Luiso在关于不被垃圾回收实习字符串评论。这是个好的观点。在一个非常繁忙的Web应用程序中,这个应用程序不会频繁地(或永远)回收应用程序池,这将是一个严重的问题。

谢天谢地,最新版本的.NET通过ConditionalWeakTable<TK,TV>类拥有ephemeron支持。这给解决这个问题的一个方便记忆安全的方式:

private static readonly ConditionalWeakTable<object, ConcurrentDictionary<string, object>> 
Ephemerons = new ConditionalWeakTable<object, ConcurrentDictionary<string, object>>(); 

public static Guid GetId(this HttpContext ctx) => new HttpContextWrapper(ctx).GetId(); 

public static Guid GetId(this HttpContextBase ctx) 
{ 
    var dict = Ephemerons.GetOrCreateValue(ctx); 
    var id = (Guid)dict.GetOrAdd(
     "c53fd485-b6b6-4da9-9e9d-bf30500d510b", 
     _ => Guid.NewGuid()); 
    return id; 
} 

Overby.Extensions.Attachments包有一个扩展方法,简化的东西。

/// <summary> 
/// Unique identifier for the object reference. 
/// </summary> 
public static Guid GetReferenceId(this object obj) => 
    obj.GetOrSetAttached(() => Guid.NewGuid(), RefIdKey); 

使用该扩展方法,您可以拨打httpContext.GetReferenceId()

+0

为什么你在这里使用'string.Intern'作为互斥量? – robbymurphy 2016-05-09 13:57:32

+0

因为它产生了一个我不必追踪的对象引用。我在这里详细讨论它:http://*.com/a/29878495/64334 – 2016-07-07 15:22:11

+0

为什么downvote? – 2016-07-07 15:22:18