Porównaj ceny domen i usług IT, sprzedawców z całego świata

Unikalny identyfikator MVC Asp.Net dla każdego żądania


W naszej witrynie MVC 5 bez sesji musimy uzyskać/wygenerować unikalny identyfikator dla każdego żądania. Będzie on używany jako identyfikator do rejestrowania wszystkich działań w żądaniu.
Czy istnieje sposób przypisania/pobrania wartości do zapytania, aby to umożliwić?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dodaj go do kolekcji żądań odetocode.com/articles/111.aspx
Guid.NewGuid()

Zostanie wygenerowany unikalny identyfikator.
http://msdn.microsoft.com/en-us/ library/system.guid.newguid (v = vs.110). aspx
http://msdn.microsoft.com/en-u ... wguid(v=vs.110).aspx
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto kilka metod rozszerzających, które stworzyłem w tym celu:
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];
}
}


Aktualizacja
>
@Luiso wskazał, że wewnętrzne ciągi nie są zbierane jako śmieci. To jest dobra uwaga. W przypadku bardzo obciążonej aplikacji internetowej, która rzadko (lub nigdy) ponownie przetwarza pule aplikacji, byłby to poważny problem.
Na szczęście najnowsze wersje platformy .NET obsługują efemerię za pośrednictwem klasy
ConditionalWeakTable & < TK, TV & >
. Co daje wygodny i bezpieczny dla pamięci sposób rozwiązania tego problemu:
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;
}

Mój pakiet Overby.Extensions.Attachments ma metodę rozszerzenia, która ułatwia pracę.
/// <summary>
/// Unique identifier for the object reference.
/// </summary>
public static Guid GetReferenceId(this object obj) =>
obj.GetOrSetAttached(() => Guid.NewGuid(), RefIdKey);

Korzystając z tej metody rozszerzenia, po prostu wywołujesz
httpContext.GetReferenceId ()
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli potrzebujesz pojedynczej wartości bez konieczności implementowania czegoś takiego jak
Guid.NewGuid ()
, być może będzie działać znacznik czasu
HttpContext
.
int requestId = System.Web.HttpContext.Current.Timestamp.Ticks;

Jeden tyknięcie to sto nanosekund, czyli jedna dziesięciomilionowa część sekundy. 10000 TEC na milisekundę lub 10 milionów TEC na sekundę.

Decyzja ta musi być następnie oceniona zgodnie z ich okolicznościami, ponieważ istnieje możliwość, że dwa wnioski przypadają na ten sam Tick czasu.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się