2013-04-04 25 views
5

Sto cercando di compilare un file rasoio con questa lineaRazorEngine parse getta impossibile compilare

RazorEngine.Razor.Parse("Hello world"); 

Ma getta solo

base {System.Exception} = {"Unable to compile template. Source file 'C:\\Windows\\TEMP\\vlu4zahf.0.cs' could not be found\n\nOther compilation errors may have occurred. Check the Errors property for more information."} 

e la proprietà errore simile al seguente:

[0] = {error CS2001: Source file 'C:\Windows\TEMP\vlu4zahf.0.cs' could not be found} 
[1] = {warning CS2008: No source files specified} 

Quindi non ci sono buone informazioni.

Io corro NET 4.0 e Razor motore 3.2.0.0

Update 1

ho individuato l'errore a questa linea nel RazorEngine

Tuple.Create(
       compileResult.CompiledAssembly.GetType("CompiledRazorTemplates.Dynamic." + context.ClassName), 
       compileResult.CompiledAssembly); 
+0

Si prega di verificare http://stackoverflow.com/questions/6444277/using-razorengine-to-parse-razor -templates-concurrently – Amit

+0

@AmitAgrawal Grazie, ma il post riguarda la sicurezza del thread. Al momento sono attivo solo un thread. –

risposta

8

Questo è probabilmente un problema di autorizzazioni per l'account utente che compila il file del rasoio. assicurarsi che ha tutti, ma l'autorizzazione di controllo completo su C: \ Windows \ Temp

Vedi qui per informazioni di fondo: http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/85f9b330-a938-4afe-a615-db83085e52d2/

+1

Non c'è un modo per impostare la directory temporanea che usa per qualcos'altro? Cosa succede se non desidero fornire l'account utente "tutto tranne il controllo completo" a Windows Temp ... – crush

+0

@crush vedere la risposta di guerillapresident sotto, che mostra come fare esattamente questo. Questo dovrebbe essere l'approccio preferito qui, la concessione di "tutto tranne il permesso completo" a una cartella del volume di sistema è sicuramente * non * una best practice. –

+1

@OskarAustegard Questa è la stessa soluzione che ho trovato. Ero preoccupato se ci fossero implicazioni sul rendimento di abilitare il caricamento del profilo utente, ma non sembra esserci. – crush

6

risposta di Adrian mi ha guidato verso una certa ricerca sul motivo per cui c: \ windows \ temp sarebbe essere necessario/usato in primo luogo. Si scopre che l'uso di questa directory è direttamente correlato al pool di app IIS che avevo creato per l'app. Il pool che stavo utilizzando aveva l'impostazione "Carica profilo utente" impostata su False. Si scopre che questo attributo è impostato su False per impostazione predefinita, semplicemente per mantenere la compatibilità con le versioni precedenti delle app progettate per l'esecuzione su IIS 6 (prima che esistesse l'opzione del profilo di caricamento) e il problema di compatibilità è isolato nei casi in cui tali app sfruttino il% temp% directory. Sebbene sia un valore predefinito, impostarlo su False non è la pratica preferita da Microsoft.

Al contrario, questa impostazione deve essere impostata su True e in tal modo fornirà all'applicazione una directory% temp% sotto il profilo dell'utente che esegue il pool di applicazioni. In questo modo si riduce la necessità di modificare le autorizzazioni del volume di sistema.

Questa impostazione è accessibile nelle Impostazioni avanzate di AppPool in Gestione IIS.

Questo può anche essere realizzato in PowerShell (Esegui come amministratore) con il seguente:

Import-Module WebAdministration 
$appPoolName = "ReplaceWithYourAppPoolName" 
$appPool = Get-Item IIS:\AppPools\$appPoolName 
$appPool.processModel.loadUserProfile = $true 
$appPool | Set-Item 
Problemi correlati