Ian*_*ink 11 asp.net-mvc asp.net-mvc-5
在我们的MVC 5站点中,没有会话,我们需要为每个请求获取/生成唯一ID.这将用作记录请求中所有活动的ID.
有没有办法为请求分配/获取值以启用此功能?
将其添加到请求项集合odetocode.com/articles/111.aspx
Guid.NewGuid()
Run Code Online (Sandbox Code Playgroud)
将生成一个唯一的ID.
http://msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx
这是我为此目的创建的一些扩展方法:
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];
}
}
Run Code Online (Sandbox Code Playgroud)
@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;
}
Run Code Online (Sandbox Code Playgroud)
我的Overby.Extensions.Attachments包有一个简化方法的扩展方法.
/// <summary>
/// Unique identifier for the object reference.
/// </summary>
public static Guid GetReferenceId(this object obj) =>
obj.GetOrSetAttached(() => Guid.NewGuid(), RefIdKey);
Run Code Online (Sandbox Code Playgroud)
使用该扩展方法,您只需调用httpContext.GetReferenceId().
| 归档时间: |
|
| 查看次数: |
9534 次 |
| 最近记录: |