クライアント アプリケーションが Web サービスを呼び出すと、System.IO.FileNotFoundException エラーが発生する
この記事は、ASP.NET Web アプリケーションが Web サービスを呼び出したときに発生する System.IO.FileNotFoundException
問題を解決するのに役立ちます。
元の製品バージョン: ASP.NET
元の KB 番号: 823196
現象
ASP.NET Web アプリケーションで Web サービスを呼び出すと、次のエラーが発生する可能性があります。
System.IO.FileNotFoundException
原因
次のいずれかの条件に該当する場合は、エラーが発生する可能性があります。
ワーカー プロセスには、プロセスの一時ディレクトリに読み取るアクセス許可がありません。また、ワーカー プロセスにはプロセスの一時ディレクトリに書き込むアクセス許可がありません。
注:
クラスは
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 ディレクトリでの読み取りアクセス権と書き込みアクセス権が必要です。
注:
偽装を使用する場合、偽装されたユーザーは Temp ディレクトリに対するフル アクセス権を持っている必要があります。
Temp ディレクトリのワーカー プロセス アカウントに必要なアクセス許可を割り当てるには、次の手順に従います。
Windows エクスプローラーで、 を
%windir%\temp directory
見つけます。を右クリックし、[
%windir%\temp
プロパティ] を選択します。[ プロパティ ] ウィンドウで、[ セキュリティ ] タブを選択します。
[ 追加] を選択し、「 ServerName\ASPNET」と入力し、[ OK] を選択します。
注:
ServerName を Web サーバーの名前に置き換えます。
IIS 6.0 にアプリケーションをデプロイした場合は、 ASPNET を NETWORK SERVICE に置き換えます。
[許可] で、[フル コントロール チェック] ボックスを選択し、[OK] を選択します。
解決策 2: XmlSerializer によって生成されたコードでコンパイラ エラーを検索する
コンパイラによって生成されたエラーを見つけるには、コンパイラによって生成されたファイルを保持するために 、Web.config ファイルに切り替えを追加する必要があります。 これを行うには、次の手順を実行します。
メモ帳などのテキスト エディターで Web.config ファイルを開きます。
XmlSerialization.Compilation
次のように、コードのセクションに<system.diagnostics>
スイッチを追加します。<configuration> <system.diagnostics> <switches> <add name="XmlSerialization.Compilation" value="4"/> </switches> </system.diagnostics> </configuration>
クライアント アプリケーションを実行します。
クライアント アプリケーションが Web サービスを呼び出します。
ディレクトリに
%windir%\temp
_tmpname.00.cs ファイルと _tmpname.out ファイルがあることを確認します。_tmpname.00.cs ファイルは生成されたソースです。 _tmpname.out ファイルにはコンパイラ エラーが必要です。
注:
読み取りアクセス許可を有効にし、ワーカー プロセス アカウント (ASPNET または NETWORK SERVICE) への書き込みアクセス許可を有効にして、Temp ディレクトリ内のファイルを書き込
%tmpname%
みます。
状態
この動作は仕様です。
動作の再現手順
次のセクションでは、動作を再現する手順について説明します。
Web サービスを作成する
Visual Studio .NET を起動します。
Visual C# .NET または Visual Basic .NET を使用して、新しい ASP.NET Web サービス プロジェクトを作成します。
既定では、 Service1.asmx が作成されます。
プロジェクトに WebServiceTemp という名前を付けます。
ソリューション エクスプローラーで、[Service1.asmx] を右クリックし、[コードの表示] を選択します。
Service1.asmx.cs ファイル (または Visual Basic .NET を使用している場合は Service1.asmx.vb ファイル) で、既定
HelloWorld()
の Web メソッドのコメントを解除します。[ビルド] メニューの [ソリューションのビルド] をクリックします。
クライアント Web アプリケーションを作成する
Visual C# .NET または Visual Basic .NET を使用して、新しい ASP.NET Web アプリケーションを作成します。
プロジェクトに WebAppTemp という名前を付けます。
ソリューション エクスプローラーで、[参照] を右クリックし、[Web 参照の追加] を選択します。
[ アドレス ] テキスト ボックスに、 WebServiceTemp の次の URL を入力します。
http://localhost/WebServiceTemp/Service1.asmx
[ 移動] を選択し、[ 参照の追加] を選択します。
WebForm1 をダブルクリックしてイベント コードを
Page_Load
開きます。イベント ハンドラーに次のコードを
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())
[ビルド] メニューの [ソリューションのビルド] をクリックします。
Temp ディレクトリに対するアクセス許可を設定する
Temp ディレクトリのワーカー プロセス アカウントに必要なアクセス許可を割り当てるには、次の手順に従います。
Windows エクスプローラーで、ディレクトリを
%windir%
見つけます。を右クリックし、[
%windir%\temp
プロパティ] を選択します。[ プロパティ ] ウィンドウで、[ セキュリティ ] タブを選択します。
[ 追加] を選択し、「 ServerName\ASPNET」と入力し、[ OK] を選択します。
[許可] で [書き込みチェック] ボックスが選択されていないことを確認し、[OK] を選択します。
Web アプリケーションを実行します。
この記事の「 現象 」セクションに記載されているエラーが表示される場合があります。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示