Viene visualizzato un errore System.IO.FileNotFoundException quando l'applicazione client chiama un servizio Web
Questo articolo illustra come risolvere il problema che System.IO.FileNotFoundException
si verifica quando un'applicazione Web ASP.NET chiama un servizio Web.
Versione originale del prodotto: ASP.NET
Numero KB originale: 823196
Sintomi
Quando si chiama un servizio Web in un'applicazione Web ASP.NET, è possibile che venga visualizzato l'errore seguente:
System.IO.FileNotFoundException
Causa
È possibile che venga visualizzato l'errore se una delle condizioni seguenti è vera:
Il processo di lavoro non dispone delle autorizzazioni per la lettura nella directory Temp del processo e il processo di lavoro non dispone delle autorizzazioni per la scrittura nella directory temp del processo.
Note
La
XmlSerializer
classe genera e compila il codice in tempo reale per eseguire la serializzazione e la deserializzazione.XmlSerializer
usa Code Document Object Model (CodeDom) per eseguire la compilazione. La compilazione CodeDom usa file temporanei su un disco. Se il processo di lavoro non dispone delle autorizzazioni di lettura per la directory Temp e le autorizzazioni di scrittura per la directory Temp, tutte le chiamate al servizio Web hanno esito negativo. Pertanto, il processo di lavoro richiede le autorizzazioni di lettura per la directory Temp e le autorizzazioni di scrittura per la directory Temp.Nel codice
XmlSerializer
generato sono presenti errori di compilazione.
Risoluzione 1: Assegnare le autorizzazioni all'account del processo di lavoro nella directory Temp
Per risolvere questo problema, l'account del processo di lavoro ASP.NET (l'account ASPNET o l'account DEL SERVIZIO DI RETE se l'applicazione viene distribuita in Internet Information Services (IIS) 6.0) deve avere accesso in lettura e scrittura nella directory Temp.
Note
Se si usa la rappresentazione, l'utente rappresentato deve avere accesso completo alla directory Temp.
Per assegnare le autorizzazioni necessarie all'account del processo di lavoro nella directory Temp, seguire questa procedura:
In Esplora risorse individuare .
%windir%\temp directory
Fare clic con il pulsante destro del mouse su
%windir%\temp
e quindi scegliere Proprietà.Nella finestra Proprietà selezionare la scheda Sicurezza.
Selezionare Aggiungi, digitare NomeServer\ASPNET e quindi selezionare OK.
Note
Sostituire ServerName con il nome del server Web.
Sostituire ASPNET con NETWORK SERVICE se l'applicazione è stata distribuita in IIS 6.0.
In Consenti selezionare la casella di controllo Controllo completo e quindi selezionare OK.
Risoluzione 2: trovare gli errori del compilatore nel codice generato da XmlSerializer
Per trovare gli errori generati dal compilatore, è necessario aggiungere un'opzione al file Web.config per mantenere i file generati dal compilatore. A tale scopo, effettuare i passaggi seguenti:
Aprire il file Web.config in un editor di testo, ad esempio Blocco note.
Aggiungere un'opzione
XmlSerialization.Compilation
alla<system.diagnostics>
sezione del codice, come indicato di seguito:<configuration> <system.diagnostics> <switches> <add name="XmlSerialization.Compilation" value="4"/> </switches> </system.diagnostics> </configuration>
Eseguire l'applicazione client.
L'applicazione client chiama il servizio Web.
Verificare che nella
%windir%\temp
directory sia presente il file _tmpname.00.cs e il file _tmpname.out .Il file _tmpname.00.cs è l'origine generata. Il file _tmpname.out deve contenere gli errori del compilatore.
Note
Abilitare le autorizzazioni di lettura e abilitare le autorizzazioni di scrittura per l'account del processo di lavoro (ASPNET o NETWORK SERVICE) per scrivere
%tmpname%
file nella directory Temp.
Stato
Questo comportamento è impostato a livello di progettazione.
Passaggi per riprodurre il comportamento
Le sezioni seguenti forniscono informazioni sui passaggi per riprodurre il comportamento.
Creare un servizio Web
Avviare Visual Studio .NET.
Creare un nuovo progetto di servizio Web ASP.NET usando Visual C# .NET o Visual Basic .NET.
Per impostazione predefinita, viene creato Service1.asmx .
Assegnare al progetto il nome WebServiceTemp.
In Esplora soluzioni fare clic con il pulsante destro del mouse su Service1.asmx e quindi scegliere Visualizza codice.
Nel file Service1.asmx.cs (o nel file Service1.asmx.vb se si usa Visual Basic .NET), rimuovere il commento dal metodo Web predefinito
HelloWorld()
.Scegliere Compila soluzione dal menu Compila.
Creare un'applicazione Web client
Creare una nuova applicazione Web ASP.NET usando Visual C# .NET o Visual Basic .NET.
Denominare il progetto WebAppTemp.
In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti e quindi scegliere Aggiungi riferimento Web.
Nella casella di testo Indirizzo digitare l'URL seguente per WebServiceTemp:
http://localhost/WebServiceTemp/Service1.asmx
Selezionare Vai e quindi Aggiungi riferimento.
Fare doppio clic su WebForm1 per aprire il codice dell'evento
Page_Load
.Aggiungere il codice seguente al
Page_Load
gestore eventi.Codice di esempio .NET per Visual C#
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());
Codice di esempio .NET di Visual Basic
'Start an instance of the Web service client-side proxy. Dim myProxy As localhost.Service1 = New localhost.Service1() Response.Write(myProxy.HelloWorld())
Scegliere Compila soluzione dal menu Compila.
Impostare le autorizzazioni per la directory Temp
Per assegnare le autorizzazioni necessarie all'account del processo di lavoro nella directory Temp, seguire questa procedura:
In Esplora risorse individuare la
%windir%
directory.Fare clic con il pulsante destro del mouse su
%windir%\temp
e quindi scegliere Proprietà.Nella finestra Proprietà selezionare la scheda Sicurezza.
Selezionare Aggiungi, digitare NomeServer\ASPNET e quindi selezionare OK.
Assicurarsi che la casella di controllo Scrittura non sia selezionata in Consenti e quindi selezionare OK.
Eseguire l'applicazione Web.
È possibile che venga visualizzato l'errore menzionato nella sezione Sintomi di questo articolo.