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

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

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

現象

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

System.IO.FileNotFoundException

原因

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

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

    注:

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

  • 生成されたコードにコンパイル エラーがあります XmlSerializer

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

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

注:

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

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

  1. Windows エクスプローラーで、 %windir%\temp directory.

  2. 右クリックし、[%windir%\tempプロパティ] を選択します。

  3. [プロパティ] ウィンドウで、[セキュリティ] タブを選択します。

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

    注:

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

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

  5. [許可] で [フル コントロール] チェック ボックスをオンにし、[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 ファイルには、コンパイラ エラーが発生している必要があります。

    注:

    読み取りアクセス許可を有効にし、一時ディレクトリにファイルを書き込むワーカー プロセス アカウント (ASPNET または NETWORK SERVICE) への書き込み %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. ソリューション エクスプローラーで [参照] を右クリックし、[Web 参照の追加] を選択します。

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

  2. 右クリックし、[%windir%\tempプロパティ] を選択します。

  3. [ プロパティ ] ウィンドウで、[ セキュリティ ] タブを選択します。

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

  5. [許可] で [書き込み] チェック ボックスがオフになっていることを確認し、[OK] を選択します

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

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