2011-02-18 5 views
5

Attualmente ho un'applicazione .net mvc3 che è responsabile della gestione di viste simili in più posizioni che utilizzano anche gli stessi controller, ad esempio site1/v1/views/index.cshtml e site1/v2/views/index.cshtml.MVC Razor ViewEngine non thread-safe?

Il modo in cui questo viene gestito è la creazione di un CustomControllerFactory che eredita da DefaultControllerFactory e nel metodo CreateController, cancellare i motori di vista esistenti e aggiungere un nuovo viewEngine personalizzato che specifica i formati di visualizzare la posizione in base al largo l'URL corrente.

Se le terre utente sul site1.com/v1/index.cshtml, il viewengine specificano le posizioni Vista su:

string versionDirectory = "v1"; 
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml", 
          "/Views/{0}.cshtml", 
          "~/Shared/{0}.cshtml" 
          }; 

Il problema che sto avendo è che se più utenti atterrano su pagine diverse più o meno allo stesso tempo tutti gli utenti vedrà la stessa vista.

Initially i thought this was related to caching, ma dopo aver impostato esplicitamente usecache = false nella vista personalizzataEngine, sembra che questo abbia più a che fare con lo ViewEngines class not being thread safe.

Qualcuno ha qualche idea su come posso ottenere lo stesso risultato, ma in un modo diverso?

grazie in anticipo.

+0

non si sa come si sta facendo questo, ma tutti gli oggetti statici sono condivisi tra tutte le richieste - che potrebbe essere correlato al tuo problema ... – Buildstarted

risposta

9

La raccolta ViewEngines è una raccolta statica e quindi i suoi valori sono condivisi tra le richieste. Quello che stai tentando di fare è possibile, ma il modo in cui lo stai facendo non è corretto.

Un approccio semplice è quello di scrivere un motore di visualizzazione personalizzato che deriva da RazorViewEngine e sovrascrivere il metodo FindView. Questo metodo è chiamato una volta per richiesta. Nell'implementazione, chiama base.FindView e modifica il risultato (se non è null) per includere le informazioni sul sito necessarie.

Scott Hanselman ha un post sul blog che mostra un esempio di ricerca in un'altra posizione per le visualizzazioni tramite un motore di visualizzazione personalizzato. http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

+0

Grazie! Questo funziona – kfegen

+0

FYI la fonte in quel post ha un grosso bug di produzione, c'è una versione aggiornata del suo motore di visualizzazione su: https://bitbucket.org/shanselman/mobileviewengines/src/48310997a453/Helpers/MobileCapableRazorViewEngine.cs indipendentemente dal post originale e il nuovo link che ho fornito sono stati la chiave per risolvere la mia scelta sbagliata per modificare la raccolta base.ViewLocationFormats non capendo che era statica rispetto a http request scopeed che ho pensato erroneamente. –

1

I motori di visualizzazione incorporati SONO filettati. Il tuo problema è il caching o il tuo motore di visualizzazione personalizzato. Controllare i commenti di memorizzazione nella cache nel collegamento nell'altra risposta.