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 XmlSerializer para realizar la serialización y la deserialización. XmlSerializer usa 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 XmlSerializer generado.

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:

  1. En Windows Explorer, busque %windir%\temp directory el archivo .

  2. Haga clic con el %windir%\temp botón secundario en y, a continuación, seleccione Propiedades.

  3. En la ventana Propiedades, seleccione la pestaña Seguridad.

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

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

  1. Abra el Web.config en un editor de texto, como Bloc de notas.

  2. Agregue un XmlSerialization.Compilation modificador 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>
    
  3. Ejecute la aplicación cliente.

    La aplicación cliente llama al servicio web.

  4. Compruebe que %windir%\temp el 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

  1. Inicie Visual Studio .NET.

  2. Cree un nuevo ASP.NET de servicio web mediante Visual C# .NET o Visual Basic .NET.

    De forma predeterminada, se crea Service1.asmx.

  3. Asigne al proyecto el nombre WebServiceTemp.

  4. En el Explorador de soluciones, haga clic con el botón secundario en Service1.asmx y, a continuación, seleccione Ver código.

  5. En el archivo Service1.asmx.cs (o el archivo Service1.asmx.vb si usa Visual Basic .NET), descomprima el método HelloWorld() web predeterminado.

  6. En el menú Generar, seleccione Generar solución.

Crear una aplicación web cliente

  1. Cree una nueva aplicación ASP.NET web mediante Visual C# .NET o Visual Basic .NET.

  2. Asigne al proyecto el nombre WebAppTemp.

  3. En el Explorador de soluciones, haga clic con el botón secundario en Referencias y, a continuación, seleccione Agregar referencia web.

  4. En el cuadro de texto Dirección, escriba la siguiente dirección URL para WebServiceTemp:
    http://localhost/WebServiceTemp/Service1.asmx

  5. Seleccione Ir y, a continuación, seleccione Agregar referencia.

  6. Haga doble clic en WebForm1 para abrir el Page_Load código de evento.

  7. Anexa el siguiente código al controlador Page_Load de 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())
      
  8. 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:

  1. En Windows Explorer, busque el %windir% directorio.

  2. Haga clic con el %windir%\temp botón secundario en y, a continuación, seleccione Propiedades.

  3. En la ventana Propiedades, seleccione la pestaña Seguridad.

  4. Seleccione Agregar, escriba ServerName\ASPNET y, a continuación, seleccione Aceptar.

  5. Asegúrese de que la casilla Escribir no está activada en Permitir y, a continuación, seleccione Aceptar.

  6. Ejecute la aplicación web.

    Es posible que reciba el error que se menciona en la sección Síntomas de este artículo.