Condividi tramite


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:

  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 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.

  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 tale scopo, effettuare i passaggi seguenti:

  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 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

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

  6. Scegliere Compila soluzione dal menu Compila.

Creare un'applicazione Web client

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

  2. Denominare il progetto 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 .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())
      
  8. 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:

  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 NomeServer\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 menzionato nella sezione Sintomi di questo articolo.