Recibe un error System.IO.FileNotFoundException cuando la aplicación cliente llama a un servicio web.
Este artículo le ayuda a resolver el problema que System.IO.FileNotFoundException
se produce cuando una aplicación web de ASP.NET llama a un servicio web.
Versión original del producto: ASP.NET
Número de KB original: 823196
Síntomas
Al llamar a un servicio web en una aplicación web de ASP.NET, puede recibir el siguiente error:
System.IO.FileNotFoundException
Causa
Puede recibir el error si se cumple una de las condiciones siguientes:
El proceso de trabajo no tiene permisos para leer en el directorio Temp del proceso y el proceso de trabajo no tiene permisos para escribir en el directorio Temp del proceso.
Nota:
La
XmlSerializer
clase genera y compila código sobre la marcha para realizar la serialización y deserialización.XmlSerializer
usa Code Document Object Model (CodeDom) para realizar la compilación. La compilación CodeDom usa archivos temporales en un disco. Si el proceso de trabajo no tiene los permisos de lectura en el directorio Temp y los permisos de escritura en el directorio Temp, se producirá un error en todas las llamadas al servicio web. Por lo tanto, el proceso de trabajo requiere los permisos de lectura en el directorio Temp y los permisos de escritura en el directorio Temp.Hay errores de compilación en el código generado
XmlSerializer
.
Resolución 1: Asignación de permisos a la cuenta de proceso de trabajo en el directorio Temp
Para resolver este problema, la cuenta de proceso de trabajo de ASP.NET (la cuenta de ASPNET o la cuenta de SERVICIO DE RED si la aplicación se implementa en Internet Information Services (IIS) 6.0) debe tener acceso de lectura y acceso de escritura en el directorio Temp.
Nota:
Si usa la suplantación, el usuario suplantado debe tener acceso total en el directorio Temp.
Para asignar los permisos necesarios a la cuenta de proceso de trabajo en el directorio Temp, siga estos pasos:
En el Explorador de Windows, busque .
%windir%\temp directory
Haga clic con el botón derecho en
%windir%\temp
y seleccione Propiedades.En la ventana Propiedades , seleccione la pestaña Seguridad .
Seleccione Agregar, escriba NombreDeServidor\ASPNET y, a continuación, seleccione Aceptar.
Nota:
Reemplace ServerName por el nombre del servidor web.
Reemplace ASPNET por NETWORK SERVICE si implementó la aplicación en IIS 6.0.
En Permitir, active la casilla Control total y, a continuación, seleccione Aceptar.
Resolución 2: Búsqueda de errores del compilador en el código generado por XmlSerializer
Para buscar errores generados por el compilador, debe agregar un modificador al archivo Web.config para mantener los archivos generados por el compilador. Para ello, siga estos pasos:
Abra el archivo Web.config en un editor de texto, como el Bloc de notas.
Agregue un
XmlSerialization.Compilation
modificador a la<system.diagnostics>
sección del código, como se indica a continuación:<configuration> <system.diagnostics> <switches> <add name="XmlSerialization.Compilation" value="4"/> </switches> </system.diagnostics> </configuration>
Ejecute la aplicación cliente.
La aplicación cliente llama al servicio web.
Compruebe que el
%windir%\temp
directorio tiene el archivo _tmpname.00.cs y el archivo _tmpname.out .El archivo _tmpname.00.cs es el origen generado. El archivo _tmpname.out debe tener los errores del compilador.
Nota:
Habilite los permisos de lectura y habilite los permisos de escritura en la cuenta de proceso de trabajo (ASPNET o NETWORK SERVICE) para escribir
%tmpname%
archivos en el directorio Temp.
Estado
Este comportamiento es por diseño.
Pasos para reproducir el comportamiento
En las secciones siguientes se proporciona información sobre los pasos para reproducir el comportamiento.
Crear un servicio web
Inicie Visual Studio .NET.
Cree un nuevo proyecto de servicio web ASP.NET mediante Visual C# .NET o Visual Basic .NET.
De forma predeterminada, se crea Service1.asmx .
Asigne al proyecto el nombre WebServiceTemp.
En Explorador de soluciones, haga clic con el botón derecho en Service1.asmx y seleccione Ver código.
En el archivo Service1.asmx.cs (o el archivo Service1.asmx.vb si usa Visual Basic .NET), quite la marca de comentario del método web predeterminado
HelloWorld()
.En el menú Compilar, seleccione Compilar solución.
Creación de una aplicación web cliente
Cree una aplicación web de ASP.NET mediante Visual C# .NET o Visual Basic .NET.
Asigne al proyecto el nombre WebAppTemp.
En Explorador de soluciones, haga clic con el botón derecho en Referencias y seleccione Agregar referencia web.
En el cuadro de texto Dirección , escriba la siguiente dirección URL para WebServiceTemp:
http://localhost/WebServiceTemp/Service1.asmx
Seleccione Go (Ir) y, a continuación, seleccione Add Reference (Agregar referencia).
Haga doble clic en WebForm1 para abrir el código de
Page_Load
evento.Anexe el código siguiente al controlador de
Page_Load
eventos.Código de ejemplo de .NET de Visual C#
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());
Código de ejemplo de .NET de Visual Basic
'Start an instance of the Web service client-side proxy. Dim myProxy As localhost.Service1 = New localhost.Service1() Response.Write(myProxy.HelloWorld())
En el menú Compilar, seleccione Compilar solución.
Establecimiento de permisos en el directorio Temp
Para asignar los permisos necesarios a la cuenta de proceso de trabajo en el directorio Temp, siga estos pasos:
En el Explorador de Windows, busque el
%windir%
directorio .Haga clic con el botón derecho en
%windir%\temp
y seleccione Propiedades.En la ventana Propiedades , seleccione la pestaña Seguridad .
Seleccione Agregar, escriba NombreDeServidor\ASPNET y, a continuación, seleccione Aceptar.
Asegúrese de que la casilla Escribir no está activada en Permitir y, a continuación, seleccione Aceptar.
Ejecute la aplicación web.
Puede recibir el error mencionado en la sección Síntomas de este artículo.