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 se produce cuando una System.IO.FileNotFoundException ASP.NET web llama a un servicio web.
Versión del producto original: ASP.NET
Número KB original: 823196
Síntomas
Al llamar a un servicio web en una ASP.NET web, puede recibir el siguiente error:
System.IO.FileNotFoundException
Causa
Puede recibir el error si se cumple una de las siguientes condiciones:
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 clase genera y compila código al instante
XmlSerializerpara realizar la serialización y la deserialización.XmlSerializerusa el modelo de objetos de documento de código (CodeDom) para realizar la compilación. La compilación de 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, todas las llamadas al servicio web producirán un error. 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
XmlSerializergenerado.
Resolución 1: Asignar 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 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 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 Windows Explorer, busque
%windir%\temp directoryel archivo .Haga clic con el
%windir%\tempbotón secundario en y, a continuación, seleccione Propiedades.En la ventana Propiedades, seleccione la pestaña Seguridad.
Seleccione Agregar, escriba ServerName\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: Buscar 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 Web.config en un editor de texto, como Bloc de notas.
Agregue un
XmlSerialization.Compilationmodificador a la sección del<system.diagnostics>código, como se muestra 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
%windir%\tempel directorio tiene el _tmpname.00.cs y el _tmpname.out.El _tmpname.00.cs es el origen generado. El _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 SERVICIO DE RED ) para escribir archivos
%tmpname%en el directorio Temp.
Estado
Este comportamiento es una característica del diseño de la aplicación.
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 ASP.NET de servicio web mediante Visual C# .NET o Visual Basic .NET.
De forma predeterminada, se crea Service1.asmx.
Asigne al proyecto el nombre WebServiceTemp.
En el Explorador de soluciones, haga clic con el botón secundario en Service1.asmx y, a continuación, seleccione Ver código.
En el archivo Service1.asmx.cs (o el archivo Service1.asmx.vb si usa Visual Basic .NET), descomprima el método
HelloWorld()web predeterminado.En el menú Generar, seleccione Generar solución.
Crear una aplicación web cliente
Cree una nueva aplicación ASP.NET web mediante Visual C# .NET o Visual Basic .NET.
Asigne al proyecto el nombre WebAppTemp.
En el Explorador de soluciones, haga clic con el botón secundario en Referencias y, a continuación, seleccione Agregar referencia web.
En el cuadro de texto Dirección, escriba la siguiente dirección URL para WebServiceTemp:
http://localhost/WebServiceTemp/Service1.asmxSeleccione Ir y, a continuación, seleccione Agregar referencia.
Haga doble clic en WebForm1 para abrir el
Page_Loadcódigo de evento.Anexa el siguiente código al controlador
Page_Loadde eventos.Visual C# código de ejemplo de .NET
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());Visual Basic de ejemplo .NET
'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ú Generar, seleccione Generar solución.
Establecer 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 Windows Explorer, busque el
%windir%directorio.Haga clic con el
%windir%\tempbotón secundario en y, a continuación, seleccione Propiedades.En la ventana Propiedades, seleccione la pestaña Seguridad.
Seleccione Agregar, escriba ServerName\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.
Es posible que reciba el error que se menciona en la sección Síntomas de este artículo.