클라이언트 애플리케이션이 웹 서비스를 호출할 때 System.IO.FileNotFoundException 오류가 발생합니다.

이 문서는 ASP.NET 웹 애플리케이션이 웹 서비스를 호출할 System.IO.FileNotFoundException 때 발생하는 문제를 resolve 데 도움이 됩니다.

원래 제품 버전: ASP.NET
원래 KB 번호: 823196

증상

ASP.NET 웹 애플리케이션에서 웹 서비스를 호출하면 다음 오류가 발생할 수 있습니다.

System.IO.FileNotFoundException

원인

다음 조건 중 하나가 true이면 오류가 발생할 수 있습니다.

  • 작업자 프로세스에는 Temp 디렉터리 프로세스에 읽을 수 있는 권한이 없으며 작업자 프로세스에는 Temp 디렉터리 프로세스에 쓸 수 있는 권한이 없습니다.

    참고

    클래스는 XmlSerializer 직렬화 및 역직렬화를 수행하기 위해 즉시 코드를 생성하고 컴파일합니다. XmlSerializer 에서는 CodeDom(코드 문서 개체 모델)을 사용하여 컴파일을 수행합니다. CodeDom 컴파일은 디스크에 임시 파일을 사용합니다. 작업자 프로세스에 Temp 디렉터리에 대한 읽기 권한과 Temp 디렉터리에 대한 쓰기 권한이 없으면 웹 서비스에 대한 모든 호출이 실패합니다. 따라서 작업자 프로세스에는 Temp 디렉터리에 대한 읽기 권한과 Temp 디렉터리에 대한 쓰기 권한이 필요합니다.

  • 생성된 코드 XmlSerializer 에 컴파일 오류가 있습니다.

해결 방법 1: Temp 디렉터리의 작업자 프로세스 계정에 권한 할당

이 문제를 resolve 위해 ASP.NET 작업자 프로세스 계정(애플리케이션이 IIS(인터넷 정보 서비스) 6.0에 배포된 경우 ASPNET 계정 또는 네트워크 서비스 계정)에는 Temp 디렉터리에 대한 읽기 액세스 및 쓰기 권한이 있어야 합니다.

참고

가장을 사용하는 경우 가장된 사용자는 Temp 디렉터리에 대한 모든 권한이 있어야 합니다.

Temp 디렉터리의 작업자 프로세스 계정에 필요한 권한을 할당하려면 다음 단계를 수행합니다.

  1. Windows Explorer 을 찾습니다%windir%\temp directory.

  2. 를 마우스 오른쪽 단추로 클릭한 %windir%\temp다음 속성을 선택합니다.

  3. 속성 창에서 보안 탭을 선택합니다.

  4. 추가를 선택하고 ServerName\ASPNET을 입력한 다음 확인을 선택합니다.

    참고

    ServerName을 웹 서버 이름으로 바꿉 있습니다.

    IIS 6.0에 애플리케이션을 배포한 경우 ASPNETNETWORK SERVICE 로 대체합니다.

  5. 허용에서 모든 권한 검사 상자를 선택한 다음 확인을 선택합니다.

해결 방법 2: XmlSerializer가 생성한 코드에서 컴파일러 오류 찾기

컴파일러에서 생성된 오류를 찾으려면 Web.config 파일에 스위치를 추가하여 컴파일러에서 생성된 파일을 유지해야 합니다. 이렇게 하려면 다음과 같이 하십시오.

  1. 메모장과 같은 텍스트 편집기에서 Web.config 파일을 엽니다.

  2. XmlSerialization.Compilation 다음과 같이 코드 섹션에 스위치 <system.diagnostics> 를 추가합니다.

    <configuration>
        <system.diagnostics>
            <switches>
                <add name="XmlSerialization.Compilation" value="4"/>
            </switches>
        </system.diagnostics>
    </configuration>
    
  3. 클라이언트 애플리케이션을 실행합니다.

    클라이언트 애플리케이션은 웹 서비스를 호출합니다.

  4. %windir%\temp 디렉터리에 _tmpname.00.cs 파일과 _tmpname.out 파일이 있는지 확인합니다.

    _tmpname.00.cs 파일은 생성된 원본입니다. _tmpname.out 파일에는 컴파일러 오류가 있어야 합니다.

    참고

    읽기 권한을 사용하도록 설정하고 작업자 프로세스 계정(ASPNET 또는 NETWORK SERVICE)에 대한 쓰기 권한을 사용하도록 설정하여 Temp 디렉터리에 파일을 작성 %tmpname% 합니다.

상태

이것은 의도적으로 설계된 동작입니다.

동작을 재현하는 단계

다음 섹션에서는 동작을 재현하는 단계에 대한 정보를 제공합니다.

웹 서비스 만들기

  1. Visual Studio .NET을 시작합니다.

  2. Visual C# .NET 또는 Visual Basic .NET을 사용하여 새 ASP.NET 웹 서비스 프로젝트를 만듭니다.

    기본적으로 Service1.asmx 가 만들어집니다.

  3. 프로젝트 이름을 WebServiceTemp로 지정합니다.

  4. 솔루션 탐색기 Service1.asmx를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 선택합니다.

  5. Service1.asmx.cs 파일(또는 Visual Basic .NET을 사용하는 경우 Service1.asmx.vb 파일)에서 기본 HelloWorld() 웹 메서드의 주석 처리를 제거합니다.

  6. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

클라이언트 웹 애플리케이션 만들기

  1. Visual C# .NET 또는 Visual Basic .NET을 사용하여 새 ASP.NET 웹 애플리케이션을 만듭니다.

  2. 프로젝트 이름을 WebAppTemp로 지정합니다.

  3. 솔루션 탐색기 참조를 마우스 오른쪽 단추로 클릭한 다음 웹 참조 추가를 선택합니다.

  4. 주소 텍스트 상자에 WebServiceTemp에 대해 다음 URL을 입력합니다.
    http://localhost/WebServiceTemp/Service1.asmx

  5. 이동을 선택한 다음 참조 추가를 선택합니다.

  6. WebForm1을 두 번 클릭하여 이벤트 코드를 엽니다 Page_Load .

  7. 다음 코드를 Page_Load 이벤트 처리기에 추가합니다.

    • Visual C# .NET 샘플 코드

      // Start an instance of the Web service client-side proxy.
      localhost.Service1 myProxy = new localhost.Service1();
      Response.Write( myProxy.HelloWorld());
      
    • 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. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

Temp 디렉터리에 대한 권한 설정

Temp 디렉터리의 작업자 프로세스 계정에 필요한 권한을 할당하려면 다음 단계를 수행합니다.

  1. Windows Explorer 디렉터리를 찾 %windir% 습니다.

  2. 를 마우스 오른쪽 단추로 클릭한 %windir%\temp다음 속성을 선택합니다.

  3. 속성 창에서 보안 탭을 선택합니다.

  4. 추가를 선택하고 ServerName\ASPNET을 입력한 다음 확인을 선택합니다.

  5. 허용에서 쓰기 검사 상자가 선택되어 있지 않은지 확인한 다음 확인을 선택합니다.

  6. 웹 애플리케이션을 실행합니다.

    이 문서의 증상 섹션에 언급된 오류가 표시될 수 있습니다.