2013-04-05 11 views
23

log4net 1.2.11.0log4net richiesta ID univoco in ASP.NET

sto cercando di ottenere qualcosa che mi permetterà di fare il login con un valore univoco per ogni richiesta di ASP.NET.

Ho provato% thread, ma i thread sembrano essere riutilizzati.

Ho provato% aspnet-request e% aspnet-session che non hanno nulla di significativo al loro interno.

Ho guardato ThreadContext.Properties e LogicalThreadContext.Properties ma non hanno nulla in loro.

Qualcuno ha un trucco per fare questo? Ho bisogno della possibilità di prelevare i log di una particolare richiesta dal file di registro.

+2

Guid, uno nuovo. –

+0

Questo non è utile. Un metodo che ho, spero che funzioni, è quello di avere un contatore interlocked di thread e io lo uso per impostare il nome del thread su ogni richiesta e il thread% sembra essere pubblicato correttamente. Questo sta facendo presupporre che la mia richiesta venga eseguita end-to-end su un singolo thread. – LiteWait

+0

Ancora peggio visto che le cose girano su un pool di thread, puoi solo impostare il nome del thread una volta sola! (stranamente sembra funzionare su .Net e fallisce su Mono) – LiteWait

risposta

5

clock tick + process ID + thread ID come memorizzato quando la richiesta inizia dovrebbero essere sufficienti, penso (assumendo ogni thread gestisce 1 richiesta alla volta).

22

.asmx i file continueranno a chiamare Application_BeginRequest evento in cui è possibile memorizzare il GUID univoco in HttpContext.Current.Items (utilizzando questa raccolta evitare il problema dispari quando l'elaborazione della richiesta salta i thread). Solo se si stava usando WCF (e anche in questo caso dipende dalla configurazione) questo non funzionerebbe.

Se si desidera non toccare l'applicazione stessa, è possibile utilizzare HttpContext.Current.Timestamp che restituisce l'ora in cui è iniziata l'elaborazione della richiesta. Unisciti a questo con il tuo approccio esistente per ottenere l'ID del thread e otterrai un valore unico.

7

HttpContext.Current.Items - è una buona idea.

tenta di aggiungere qualcosa di simile:

HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString()) 
1

Ecco alcuni metodi di estensione che ho creato per questo scopo:

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]; 
    } 
}