Sto implorando la mia classe ApplicationContext che utilizza il modello singleton. Voglio memorizzare la mia istanza in HttpContext.Items, poiché è accessibile in tutte le parti della richiesta. Ho letto sull'utilizzo di HttpContext con ASP.NET MVC e uno dei principali problemi è che introduce la complessità del test. Ho provato a fare ricerche sulla testabilità di HttpContext.Items, ma tutto quello che posso trovare è roba su Session. Una delle uniche cose che ho trovato è un capitolo di esempio nel libro MVC Professional ASP.NET 3.5 su Wrox (pdf link here). A pagina 15 si legge questo:HttpContext.Items con ASP.NET MVC
Qualcosa Non è possibile utilizzare: HttpContext.Items
Sopra in questa sezione, siamo venuti pulito e ti ha detto che abbiamo mentito a voi: HttpContext non è condivisa tra ASP .NET MVC e moduli Web ASP.NET. Di conseguenza, non è possibile utilizzare la raccolta HttpContext.Items per archiviare e recuperare bit di dati.
Il motivo è che quando si reindirizza a un controller, HttpHandler diventa System.Web.Mvc.MvcHandler, che viene creato utilizzando HttpContextWrapper, che avrà la propria definizione di HttpContext.Current. Sfortunatamente, durante questa stretta di mano, cose come HttpContext.Items non vengono trasferite.
Ciò che si riduce a questo è che i tipi di HttpContext, nonostante lo sguardo e il suono molto lo stesso, non sono la stessa, e non è possibile passare i dati in questo modo.
Ora, ho provato testare questo fuori, e per quanto ne so, se si reindirizza a un altro controller utilizzando RedirectToAction, HttpContext.Items non rimangono. Sto usando il progetto MVC ASP.NET predefinito per testarlo. Quello che ho fatto è, aggiungere questo metodo per Global.asax.cs:
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
E in HomeController.cs, ho cambiato il metodo Index a:
public ActionResult Index()
{
return RedirectToAction("About");
}
e ha cambiato il proposito di metodo per:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
Quando eseguo l'applicazione, la pagina reindirizza correttamente/Home/Chi e Response.Writes la corretta stringa "Ciao mondo" impostato nelle global.asax.cs.
Quindi, mi sembra come se sto o non capire ciò che il libro è significato quando dicono "cose come HttpContext.Items non vengono trasferiti" O lo fa trasferire questa roba ed è bene utilizzare HttpContext. Elementi.
Se si consiglia di evitare HttpContext.Items, esiste un altro modo alternativo per archiviare un oggetto su una richiesta in base alle richieste?
Questo è piuttosto un risorsa utile per la creazione di un "contesto di applicazione" tipo di oggetto: http://jcapka.blogspot.co.uk/2013/11/creating-application-context-for-net.html – JDandChips