Viene visualizzato un errore System.IO.FileNotFoundException quando l'applicazione client chiama un servizio Web

Questo articolo consente di 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 si verifica una delle condizioni seguenti:

  • 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 scrivere nella directory Temp del processo.

    Nota

    La XmlSerializer classe genera e compila 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 in un disco. Se il processo di lavoro non dispone delle autorizzazioni di lettura per la directory Temp e delle autorizzazioni di scrittura nella directory Temp, tutte le chiamate al servizio Web hanno esito negativo. Di conseguenza, il processo di lavoro richiede le autorizzazioni di lettura per la directory Temp e le autorizzazioni di scrittura nella 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 NETWORK SERVICE se l'applicazione è distribuita in Internet Information Services (IIS) 6.0) deve disporre dell'accesso in lettura e scrittura nella directory Temp.

Nota

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:

  1. In Esplora risorse individuare .%windir%\temp directory

  2. Fare clic con il pulsante destro del mouse su %windir%\tempe quindi scegliere Proprietà.

  3. Nella finestra Proprietà selezionare la scheda Sicurezza .

  4. Selezionare Aggiungi, digitare ServerName\ASPNET e quindi selezionare OK.

    Nota

    Sostituire ServerName con il nome del server Web.

    Sostituire ASPNET con NETWORK SERVICE se l'applicazione è stata distribuita in IIS 6.0.

  5. 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 tal fine, attenersi alla seguente procedura:

  1. Aprire il file Web.config in un editor di testo, ad esempio blocco note.

  2. 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>
    
  3. Eseguire l'applicazione client.

    L'applicazione client chiama il servizio Web.

  4. Verificare che la %windir%\temp directory contenga il file _tmpname.00.cs e il file _tmpname.out .

    Il file _tmpname.00.cs è l'origine generata. Nel file _tmpname.out devono essere presenti errori del compilatore.

    Nota

    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

Si tratta di un comportamento legato alla progettazione del prodotto.

Passaggi per riprodurre il comportamento

Le sezioni seguenti forniscono informazioni sui passaggi per riprodurre il comportamento.

Creare un servizio Web

  1. Avviare Visual Studio .NET.

  2. Creare un nuovo progetto di servizio Web ASP.NET usando Visual C# .NET o Visual Basic .NET.

    Per impostazione predefinita, viene creato Service1.asmx .

  3. Assegnare al progetto il nome WebServiceTemp.

  4. In Esplora soluzioni fare clic con il pulsante destro del mouse su Service1.asmx e quindi scegliere Visualizza codice.

  5. 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() .

  6. Nel menu Compila selezionare Compila soluzione.

Creare un'applicazione Web client

  1. Creare una nuova applicazione Web ASP.NET usando Visual C# .NET o Visual Basic .NET.

  2. Assegnare al progetto il nome WebAppTemp.

  3. In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti e quindi scegliere Aggiungi riferimento Web.

  4. Nella casella di testo Indirizzo digitare l'URL seguente per WebServiceTemp:
    http://localhost/WebServiceTemp/Service1.asmx

  5. Selezionare Vai e quindi Aggiungi riferimento.

  6. Fare doppio clic su WebForm1 per aprire il codice dell'evento Page_Load .

  7. Aggiungere il codice seguente al Page_Load gestore eventi.

    • Codice di esempio di Visual C# .NET

      // Start an instance of the Web service client-side proxy.
      localhost.Service1 myProxy = new localhost.Service1();
      Response.Write( myProxy.HelloWorld());
      
    • Codice di esempio di Visual Basic .NET

      'Start an instance of the Web service client-side proxy.
      Dim myProxy As localhost.Service1 = New localhost.Service1()
      Response.Write(myProxy.HelloWorld())
      
  8. Nel menu Compila selezionare Compila soluzione.

Impostare le autorizzazioni per la directory Temp

Per assegnare le autorizzazioni necessarie all'account del processo di lavoro nella directory Temp, seguire questa procedura:

  1. In Esplora risorse individuare la %windir% directory.

  2. Fare clic con il pulsante destro del mouse su %windir%\tempe quindi scegliere Proprietà.

  3. Nella finestra Proprietà selezionare la scheda Sicurezza .

  4. Selezionare Aggiungi, digitare ServerName\ASPNET e quindi selezionare OK.

  5. Assicurarsi che la casella di controllo Scrittura non sia selezionata in Consenti e quindi selezionare OK.

  6. Eseguire l'applicazione Web.

    È possibile che venga visualizzato l'errore indicato nella sezione Sintomi di questo articolo.