Você recebe um erro System.IO.FileNotFoundException quando o aplicativo cliente chama um serviço Web

Este artigo ajuda você a resolve o problema que System.IO.FileNotFoundException ocorre quando um aplicativo Web ASP.NET chama um serviço Web.

Versão original do produto: ASP.NET
Número de KB original: 823196

Sintomas

Ao chamar um serviço Web em um aplicativo Web ASP.NET, você pode receber o seguinte erro:

System.IO.FileNotFoundException

Motivo

Você poderá receber o erro se uma das seguintes condições for verdadeira:

  • O processo de trabalho não tem permissões para ler no diretório temp do processo e o processo de trabalho não tem permissões para gravar no diretório temp do processo.

    Observação

    A XmlSerializer classe gera e compila código em tempo real para executar serialização e desserialização. XmlSerializer usa Code Document Object Model (CodeDom) para executar a compilação. A compilação CodeDom usa arquivos temporários em um disco. Se o processo de trabalho não tiver as permissões de leitura no diretório Temp e as permissões de gravação no diretório Temp, todas as chamadas para o serviço Web falharão. Portanto, o processo de trabalho requer as permissões de leitura no diretório Temp e as permissões de gravação no diretório Temp.

  • Há erros de compilação no código gerado XmlSerializer .

Resolução 1: atribuir permissões à conta de processo de trabalho no diretório Temp

Para resolve esse problema, a conta ASP.NET processo de trabalho (a conta ASPNET ou a conta DO SERVIÇO DE REDE se seu aplicativo for implantado no IIS (Internet Information Services) 6.0) deve ter acesso de leitura e gravação no diretório Temp.

Observação

Se você usar representação, o usuário representado deverá ter acesso completo no diretório Temp.

Para atribuir permissões necessárias à conta do processo de trabalho no diretório temp, siga estas etapas:

  1. No Windows Explorer, localize o %windir%\temp directory.

  2. Clique com o botão %windir%\tempdireito do mouse e selecione Propriedades.

  3. Na janela Propriedades , selecione a guia Segurança .

  4. Selecione Adicionar, digite ServerName\ASPNET e selecione OK.

    Observação

    Substitua ServerName pelo nome do servidor Web.

    Substitua o ASPNET pelo SERVIÇO DE REDE se você implantou seu aplicativo no IIS 6.0.

  5. Em Permitir, selecione a caixa Controle Completo marcar e selecione OK.

Resolução 2: localizar erros do compilador no código gerado pelo XmlSerializer

Para encontrar erros gerados pelo compilador, você deve adicionar uma opção ao arquivo Web.config para manter arquivos gerados pelo compilador. Para fazer isso, siga estas etapas:

  1. Abra o arquivo Web.config em um editor de texto, como Bloco de Notas.

  2. Adicione uma XmlSerialization.Compilation opção à <system.diagnostics> seção do código, da seguinte maneira:

    <configuration>
        <system.diagnostics>
            <switches>
                <add name="XmlSerialization.Compilation" value="4"/>
            </switches>
        </system.diagnostics>
    </configuration>
    
  3. Execute o aplicativo cliente.

    O aplicativo cliente chama o serviço Web.

  4. Verifique se o %windir%\temp diretório tem o arquivo _tmpname.00.cs e o arquivo _tmpname.out .

    O arquivo _tmpname.00.cs é a origem gerada. O arquivo _tmpname.out deve ter os erros do compilador.

    Observação

    Habilite as permissões de leitura e habilite as permissões de gravação para a conta de processo de trabalho (ASPNET ou SERVIÇO DE REDE) para gravar %tmpname% arquivos no diretório Temp.

Status

Este é o comportamento padrão.

Etapas para reproduzir o comportamento

As seções a seguir fornecem informações sobre etapas para reproduzir o comportamento.

Criar um serviço web

  1. Inicie o Visual Studio .NET.

  2. Crie um novo projeto de serviço Web ASP.NET usando o Visual C# .NET ou o Visual Basic .NET.

    Por padrão, Service1.asmx é criado.

  3. Nomeie o projeto WebServiceTemp.

  4. Em Gerenciador de Soluções, clique com o botão direito do mouse em Service1.asmx e selecione Exibir Código.

  5. No arquivo Service1.asmx.cs (ou no arquivo Service1.asmx.vb se você estiver usando o Visual Basic .NET), descompacte o método Web padrão HelloWorld() .

  6. No menu Compilar , selecione Criar solução.

Criar um aplicativo Web cliente

  1. Crie um novo aplicativo Web ASP.NET usando Visual C# .NET ou Visual Basic .NET.

  2. Nomeie o projeto WebAppTemp.

  3. Em Gerenciador de Soluções, clique com o botão direito do mouse em Referências e selecione Adicionar Referência da Web.

  4. Na caixa de texto Endereço , digite a seguinte URL para WebServiceTemp:
    http://localhost/WebServiceTemp/Service1.asmx

  5. Selecione Ir e, em seguida, selecione Adicionar Referência.

  6. Clique duas vezes em WebForm1 para abrir o código do Page_Load evento.

  7. Anexe o código a seguir ao manipulador de Page_Load eventos.

    • Código de amostra do Visual C# .NET

      // Start an instance of the Web service client-side proxy.
      localhost.Service1 myProxy = new localhost.Service1();
      Response.Write( myProxy.HelloWorld());
      
    • Código de exemplo do 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. No menu Compilar , selecione Criar solução.

Definir permissões no diretório Temp

Para atribuir permissões necessárias à conta do processo de trabalho no diretório temp, siga estas etapas:

  1. No Windows Explorer, localize o %windir% diretório.

  2. Clique com o botão %windir%\tempdireito do mouse e selecione Propriedades.

  3. Na janela Propriedades , selecione a guia Segurança .

  4. Selecione Adicionar, digite ServerName\ASPNET e selecione OK.

  5. Verifique se a caixa Gravar marcar não está selecionada em Permitir e selecione OK.

  6. Execute o aplicativo Web.

    Você pode receber o erro mencionado na seção Sintomas deste artigo.