回答
將它添加到該請求項集合odetocode.com/articles/111.aspx
Guid.NewGuid()
會生成一個唯一的ID。
http://msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx
但是,我如何附加它發送到請求,以便在請求的整個生命週期內都可以訪問它。 – 2014-10-09 22:16:13
將它添加到請求項目集合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()
。
爲什麼你在這裏使用'string.Intern'作爲互斥量? – robbymurphy 2016-05-09 13:57:32
因爲它產生了一個我不必追蹤的對象引用。我在這裏詳細討論它:http://stackoverflow.com/a/29878495/64334 – 2016-07-07 15:22:11
爲什麼downvote? – 2016-07-07 15:22:18
- 1. 如何爲每個log4j請求生成唯一的請求ID
- 2. log4net的唯一請求ID
- 3. 如何在春天爲每個請求維護唯一的ID
- 4. Asp.net MVC5發生的Application_Start每一個請求 - 每個請求
- 5. 每次請求ASP.NET MVC 2 VirtualPathProvider GetFile
- 6. 唯一值與每個ID
- 7. 模擬一個請求(Asp.net MVC)
- 8. 爲每個請求ASP.NET
- 9. IISExpress上的ASP.NET MVC重建每個請求的整個站點
- 10. 是請求對象id唯一嗎?
- 11. GAE請求ID是否全球唯一?
- 12. 我在ServiceStack中爲每個請求分配唯一ID的選項是什麼?
- 13. 如何識別或定義每個請求的唯一日誌ID?
- 14. HOWTO爲每個唯一行添加一個唯一的ID?
- 15. 在asp.net/c#中關聯唯一的會話ID與每個唯一用戶
- 16. 在ASP.NET MVC的每個請求上執行代碼
- 17. 在Servlet中使用timemillis方法爲每個請求創建唯一的請求ID
- 18. 給每個元素的唯一的ID
- 19. ListView的每個元素的唯一ID
- 20. elasticsearch:通過一個唯一的請求
- 21. Firebase - 每個用戶的唯一ID
- 22. 每個chrome用戶的唯一ID?
- 23. Android中每個用戶的唯一ID
- 24. 每個ASP.NET請求的WCF客戶端?
- 25. 每個請求緩存的ASP.NET nHibernate
- 26. HttpContext.ApplicationInstance.Context對每個請求都是唯一的嗎?
- 27. 每個客戶端MVC的唯一CNAME
- 28. 從控制器獲取Nhibernate ISession(每個會話請求)ASP.Net MVC
- 29. 爲ASP.NET MVC控制器共享「每個請求」存儲
- 30. ASP.NET MVC:控制器是否爲每個請求創建?
[ASP.NET中的log4net唯一請求ID]可能的重複(http://stackoverflow.com/questions/15842321/log4net-unique-request-id-in-asp-net) – 2016-05-18 21:07:37