IIS ASP.net環境で動作しているプログラムの入替を行ったところ
Permissionエラーが発生するようになってしまいました。
その対処の一部始終をメモしておきます。
【概況】
・IIS + ASP.netで稼働しているWebサーバ。 (Webサービスを稼働中) Win2008R2 , IIS7.0
・Webサービスの1つに不具合があり、プログラムの入替を行う。
【環境】
・WebService Directory
|-web.config
|- bin
|- Program.dll ←今回これだけを入替
|- *.dll
【やったこと】
・Program.dllをコピーして別の場所へバックアップ
・持参した、Program.dllを、上書きコピー
結果、これでアウトでした。
起きたエラーがコレ。
型 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。
場所System.Security.CodeAccessSecurityEngine.Check(Objectdemand,StackCrawlMark&stackMark,BooleanisPermSet)
場所System.Security.CodeAccessPermission.Demand()
場所System.Reflection.Assembly.VerifyCodeBaseDiscovery(StringcodeBase)
場所System.Reflection.Assembly.get_CodeBase()
【原因】
・Internetゾーンから取得したファイルを、そのままIIS稼働環境へコピーしたため。
【対処】
・ファイルのプロパティにてブロックを解除する。
で、ダメだったので、あれこれやっているうちに、できるようになりました。
結果としては、アプリケーションプールにキャッシュされていたようです。
・アプリケーションプールの、停止、再起動を行う。
使っていたアプリケーションプールは共有だったので、個別に新規で一つ作り
新規で作ったアプリケーションプールを割り当ててみました。
その結果、改善されました。
それで、通常使っているアプリケーションプールを一旦再起動して、
アプリケーションプールの設定を元に戻すと、正常稼働。
アプリケーションプールの再起動時に、動作中プロセスの影響からなのか
「アプリケーションプールを起動できません」的なエラーが出て焦りましたが、
少し待ってから起動したら動いたので、結果問題なしといったところです。
【他に調べたこと】
・IISにキャッシュされていないか
⇒Windows\Microsoft.net\Framework**\Version\Temporary ASP.NET Files に
IISが自分のロードしたモジュールをキャッシュします。
⇒結果、問題なし。
念のため、
・アプリケーションとしての設定を解除
・該当キャッシュをクリア
・再度アプリケーションへ変換
とやり、キャッシュの再構成を行いましたが、改善せず
【やりたかったけど試してない事】
・IISの再起動
他にもアプリが動いていて、止めるにはいろいろと手間があったので、今回は除外
【まとめ】
普段はUSB媒体でプログラムの持ち込みをするのですが、今回はWeb経由で
プログラムを持ち込んだため、はまりました。
インターネットから取得したデータの扱いには十分注意しましょう。