Asp.Net MVC每个请求的唯一ID
在我们的MVC 5网站中,没有会话,我们需要为每个请求获取/生成唯一的ID。这将被用作记录请求中所有活动的ID。Asp.Net MVC每个请求的唯一ID
有没有一种方法来分配/获取值的请求来启用它?
将它添加到该请求项集合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://*.com/a/29878495/64334 – 2016-07-07 15:22:11
为什么downvote? – 2016-07-07 15:22:18
[ASP.NET中的log4net唯一请求ID]可能的重复(http://*.com/questions/15842321/log4net-unique-request-id-in-asp-net) – 2016-05-18 21:07:37