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:
No Windows Explorer, localize o
%windir%\temp directory
.Clique com o botão
%windir%\temp
direito do mouse e selecione Propriedades.Na janela Propriedades , selecione a guia Segurança .
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.
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:
Abra o arquivo Web.config em um editor de texto, como Bloco de Notas.
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>
Execute o aplicativo cliente.
O aplicativo cliente chama o serviço Web.
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
Inicie o Visual Studio .NET.
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.
Nomeie o projeto WebServiceTemp.
Em Gerenciador de Soluções, clique com o botão direito do mouse em Service1.asmx e selecione Exibir Código.
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()
.No menu Compilar , selecione Criar solução.
Criar um aplicativo Web cliente
Crie um novo aplicativo Web ASP.NET usando Visual C# .NET ou Visual Basic .NET.
Nomeie o projeto WebAppTemp.
Em Gerenciador de Soluções, clique com o botão direito do mouse em Referências e selecione Adicionar Referência da Web.
Na caixa de texto Endereço , digite a seguinte URL para WebServiceTemp:
http://localhost/WebServiceTemp/Service1.asmx
Selecione Ir e, em seguida, selecione Adicionar Referência.
Clique duas vezes em WebForm1 para abrir o código do
Page_Load
evento.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())
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:
No Windows Explorer, localize o
%windir%
diretório.Clique com o botão
%windir%\temp
direito do mouse e selecione Propriedades.Na janela Propriedades , selecione a guia Segurança .
Selecione Adicionar, digite ServerName\ASPNET e selecione OK.
Verifique se a caixa Gravar marcar não está selecionada em Permitir e selecione OK.
Execute o aplicativo Web.
Você pode receber o erro mencionado na seção Sintomas deste artigo.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários