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 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 la deserialización. XmlSerializer usa el modelo de objetos de documento de código (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 está implementada 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 el Explorador de Windows, busque .%windir%\temp directory

  2. Haga clic con el botón derecho en %windir%\tempy, 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: 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:

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

  2. 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>
    
  3. Ejecute la aplicación cliente.

    La aplicación cliente llama al servicio web.

  4. 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 SERVICIO DE RED) para escribir %tmpname% archivos en el directorio Temp.

Estado

Este comportamiento es una característica del diseño de la aplicación.

Pasos para reproducir este 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 proyecto de servicio web de ASP.NET mediante Visual C# .NET o Visual Basic .NET.

    De forma predeterminada, se crea Service1.asmx .

  3. Asigne al proyecto el nombre WebServiceTemp.

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

  5. En el archivo Service1.asmx.cs (o en el archivo Service1.asmx.vb si usa Visual Basic .NET), quite la marca del comentario del método web predeterminado HelloWorld() .

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

Creación de una aplicación web cliente

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

  2. Asigne al proyecto el nombre WebAppTemp.

  3. En Explorador de soluciones, haga clic con el botón derecho 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 Go (Ir) y, a continuación, seleccione Add Reference (Agregar referencia).

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

  7. Anexe el código siguiente al controlador de Page_Load eventos.

    • Código de ejemplo de 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 ejemplo de 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. En el menú Generar, seleccione Generar 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:

  1. En el Explorador de Windows, busque el %windir% directorio.

  2. Haga clic con el botón derecho en %windir%\tempy, 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á seleccionada en Permitir y, a continuación, seleccione Aceptar.

  6. Ejecute la aplicación web.

    Puede recibir el error que se menciona en la sección Síntomas de este artículo.