次の方法で共有


クライアント アプリケーションが Web サービスを呼び出すと、System.IO.FileNotFoundException エラーが発生する

この記事は、ASP.NET Web アプリケーションが Web サービスを呼び出したときに発生 System.IO.FileNotFoundException 問題を解決するのに役立ちます。

元の製品バージョン: ASP.NET
元の KB 番号: 823196

現象

ASP.NET Web アプリケーションで Web サービスを呼び出すと、次のエラーが表示されることがあります。

System.IO.FileNotFoundException

原因

次のいずれかの条件に該当する場合は、エラーが発生する可能性があります。

  • ワーカー プロセスには、プロセスの Temp ディレクトリに対する読み取りアクセス許可がありません。また、ワーカー プロセスには、プロセスの一時ディレクトリに書き込むアクセス許可がありません。

    Note

    XmlSerializer クラスは、シリアル化と逆シリアル化を実行するために、その場でコードを生成およびコンパイルします。 XmlSerializer は、Code Document Object Model (CodeDom) を使用してコンパイルを実行します。 CodeDom コンパイルでは、ディスク上の一時ファイルが使用されます。 ワーカー プロセスに Temp ディレクトリに対する読み取りアクセス許可と Temp ディレクトリに対する書き込みアクセス許可がない場合、Web サービスへのすべての呼び出しは失敗します。 そのため、ワーカー プロセスには、Temp ディレクトリに対する読み取りアクセス許可と、Temp ディレクトリに対する書き込みアクセス許可が必要です。

  • 生成されたコードにコンパイル エラー XmlSerializer

解決策 1: Temp ディレクトリの worker プロセス アカウントにアクセス許可を割り当てる

この問題を解決するには、ASP.NET ワーカー プロセス アカウント (アプリケーションが インターネット インフォメーション サービス (IIS) 6.0 にデプロイされている場合は、ASPNET アカウントまたは NETWORK SERVICE アカウント) に、Temp ディレクトリに対する読み取りアクセスと書き込みアクセス権が必要です。

Note

偽装を使用する場合、偽装されたユーザーは Temp ディレクトリに対するフル アクセス権を持っている必要があります。

Temp ディレクトリのワーカー プロセス アカウントに必要なアクセス許可を割り当てるには、次の手順に従います。

  1. Windows エクスプローラーで、 %windir%\temp directoryを見つけます。

  2. %windir%\tempを右クリックし、Properties を選択します。

  3. Properties ウィンドウで、Security タブを選択します。

  4. [追加を選択し、「ServerName\ASPNET」と入力し、OK を選択します。

    Note

    ServerNameを Web サーバーの名前に置き換えます。

    IIS 6.0 にアプリケーションを展開した場合はASPNETNETWORK SERVICE に置き換えます。

  5. [ Allowで、 Full Control チェック ボックスをオンにし、 OKを選択します。

解決策 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. クライアント アプリケーションを実行します。

    クライアント アプリケーションが Web サービスを呼び出します。

  4. %windir%\temp ディレクトリに_tmpname.00.cs ファイルと _tmpname.out ファイルがあることを確認します。

    _tmpname.00.cs ファイルは生成されたソースです。 _tmpname.out ファイルにはコンパイラ エラーが発生している必要があります。

    Note

    読み取りアクセス許可を有効にし、ワーカー プロセス アカウント (ASPNET または NETWORK SERVICE) への書き込みアクセス許可を有効にして、Temp ディレクトリに %tmpname% ファイルを書き込みます。

状態

この動作は仕様によるものです。

動作を再現する手順

次のセクションでは、動作を再現する手順について説明します。

Web サービスを作成する

  1. Visual Studio .NET を起動します。

  2. Visual C# .NET または Visual Basic .NET を使用して、新しい ASP.NET Web サービス プロジェクトを作成します。

    既定では、 Service1.asmx が作成されます。

  3. プロジェクトに WebServiceTemp という名前を付けます。

  4. ソリューション エクスプローラーで Service1.asmx を右クリックし、 [コードの表示] を選択

  5. Service1.asmx.cs ファイル (または Visual Basic .NET を使用している場合はService1.asmx.vb ファイル) で、既定の HelloWorld() Web メソッドのコメントを解除します。

  6. [ビルド] メニューの [ソリューションのビルド] を選択します。

クライアント Web アプリケーションを作成する

  1. Visual C# .NET または Visual Basic .NET を使用して、新しい ASP.NET Web アプリケーションを作成します。

  2. プロジェクトに WebAppTemp という名前を付けます。

  3. ソリューション エクスプローラーで、References を右クリックし、[Web 参照の追加] 選択

  4. Address テキスト ボックスに、WebServiceTemp の次の URL を入力します。
    http://localhost/WebServiceTemp/Service1.asmx

  5. Go を選択し、参照の追加を選択します。

  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 エクスプローラーで、 %windir% ディレクトリを見つけます。

  2. %windir%\tempを右クリックし、Properties を選択します。

  3. Properties ウィンドウで、Security タブを選択します。

  4. [追加を選択し、「ServerName\ASPNET」と入力し、OK を選択します。

  5. [AllowWrite チェック ボックスがオフになっていることを確認し、OK を選択します。

  6. Web アプリケーションを実行します。

    この記事の「 Symptoms 」セクションに記載されているエラーが表示されることがあります。