Domanda

Ho una classe statica con diversi metodi statici. In questi metodi, sto cercando di accedere contesto del thread corrente utilizzando HttpContext.Current. Ad esempio:

var userName = HttpContext.Current.User.Identity.Name;

Tuttavia, quando lo faccio, ricevo un NullReferenceException, il famigerato "Oggetto non impostato a un'istanza di un oggetto."

Tutte le idee?

È stato utile?

Soluzione

Non è chiaro dal post originale che il HttpContext è in realtà ciò che manca. La proprietà HttpContext.User può anche essere nullo in determinate fasi del ciclo di vita, che darebbe la stessa eccezione. Tutti gli altri problemi a parte, è necessario fare un passo attraverso la sorgente e vedere quale parte dell'espressione è in realtà null.

Quando si scrive codice che fa riferimento statici metodi / immobili come HttpContext.Current, dovete scrivere loro sapendo che il codice non è garantito per essere eseguito quando i metodi / proprietà sono effettivamente disponibili. Normalmente si ha qualcosa di simile:

static string GetCurrentUserName()
{
    HttpContext context = HttpContext.Current;
    if (context == null)
        return null;
    IPrincipal user = context.User;
    if (user == null)
        return null;
    return user.Identity.Name;
}

Anche se ho il sospetto che questo non sarebbe davvero risolvere il problema qui, sarebbe solo sbarazzarsi di eccezione. Il problema è più probabile che si sta chiamando questo metodo in un momento o il luogo in cui il contesto è semplicemente non disponibili, come ad esempio su un thread in background, costruttore statico o di un campo di inizializzazione, o nel metodo Application_BeginRequest, o qualche posto simile.

potrei iniziare modificando i metodi statici ai metodi di una classe che dipende un'istanza HttpContext (cioè presa nel costruttore) istanza. E 'facile ingannare se stessi a pensare che metodi come GetCurrentUserName sono semplici "di utilità" metodi, ma non sono realmente, ed è generalmente valida da invocare un metodo che i riferimenti HttpContext.Current attraverso la proprietà statica da qualsiasi luogo in cui non si fa già un esempio riferimento alla stessa HttpContext (cioè dalla classe Page). Le probabilità sono, se si inizia a riscrivere le vostre classi in questo modo:

public class UserResolver
{
    private HttpContext context;

    public UserResolver(HttpContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");
        this.context = context;
    }

    public string GetUserName()
    {
        return (context.User != null) ? context.User.Identity.Name : null;
    }
}

... allora è probabile scoprire molto rapidamente dove la catena è rotta, che sarà il punto in cui è necessario fare riferimento HttpContext.Current perché non può ottenere da qualsiasi altro luogo .

In questo caso specifico, ovviamente, è possibile risolvere il problema solo prendendo la traccia dello stack del NullReferenceException per scoprire dove / quando inizia la catena, in modo da non dover fare i cambiamenti che ho descritto sopra - sto semplicemente raccomandando un approccio generale che contribuirà a ridurre questo tipo di errori "missing Singleton" in futuro.

Altri suggerimenti

ho incontrato un paio di volte, soprattutto con metodi statici in un'altra libreria e non il mio progetto principale. Ho fatto ricorso a passare il HttpContext al metodo statico come un param quando nient'altro sembra funzionare.

Dove esattamente è l'eccezione nullo essere gettato? Avete il debug e vedere cosa è nullo? È il HttpContext.Current è nullo o l'utente?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top