2014-10-09 112 views
7

在我們的MVC 5網站中,沒有會話,我們需要爲每個請求獲取/生成唯一的ID。這將被用作記錄請求中所有活動的ID。Asp.Net MVC每個請求的唯一ID

有沒有一種方法來分配/獲取值的請求來啓用它?

+0

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

回答

8

將它添加到該請求項集合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

6

下面是我爲這個目的而創建的一些推廣方法:

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://stackoverflow.com/a/29878495/64334 – 2016-07-07 15:22:11

+0

爲什麼downvote? – 2016-07-07 15:22:18

相關問題