トップ回答者
IIS7.5 Webサイトを停止・開始する際の動作について

質問
-
お世話になります。
現在、IIS7.5の環境で以下のようにWebサイトを2つ用意し、同じ内容のWebアプリケーション(C#)を配置しています。
①Web Site A /APP_A
②Web Site B/APP_B
※アプリケーションプールは同一のものを適用
夜間バッチ処理にて、WebサイトAの停止、起動を
appcmd stop site /site.name:"Web Site A"
appcmd start site /site.name:"Web Site A"
のコマンドで実施しています。
IISマネージャーで
・操作 - Webサイトの管理 - 停止・開始
を実施した場合は、初回アクセス時に Application_Start() が実施されているようですが、
コマンド実施を行うとアプリケーションに初回アクセスしても、Application_Start() が実施されず、
同じ動きをするにはどのようなコマンドを実行すればよいか思案しております。
(アプリケーションプールはWebサイトA、Bで共有していますが、WebサイトBは別途処理が実施されている可能性がある為、
WebサイトAのみ再起動を実行させ、Application_Start() が実施されるようにしたいと考えております。)
お手数ですが、よろしくお願い致します。
- 移動 立花楓Microsoft employee, Moderator 2017年11月7日 7:11 Visual Studio 共通 フォーラム から
2017年11月6日 9:48
回答
-
> IISマネージャーで
> ・操作 - Webサイトの管理 - 停止・開始
> を実施した場合は、初回アクセス時に Application_Start() が実施されているようですが、
> コマンド実施を行うとアプリケーションに初回アクセスしても、Application_Start() が実施されず、実際に検証して調べたわけではないのですが、以下の記事によると IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site は同じことのように見えます。
Start or Stop a Web Site (IIS 7)
https://technet.microsoft.com/en-us/library/ea8d442e-9a0c-49bb-b940-50b22fa64dd4自分が持っている本「マイクロソフト公式解説書 一目でわかる IIS7.0」にも、
"Web サイトに対して停止や再起動の操作を行っても、アプリケーションプールに依存するもの、つまりワーカープロセスには影響がない点に注意してください"
とあります。
なので、実は、 IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site どちらも Application_Start() は実行されてないと思われるのですが・・・
> 夜間バッチ処理にて、WebサイトAの停止、起動を
その目的が何だか分かりませんが、単に Application_Start() を定期的に実行させたいということであれば、アプリケーションプールのリサイクルで事足りるのではないでしょうか?
アプリケーションプールのリサイクルは定期的(デフォルトで 1,740 分毎。決まった時間に行うことも可能です。下の画像参照)に行われ、リサイクルの後の最初のクライアントからの要求を受けた時点で Application_Start() は実行されます。
オートスタートという方法もあって、最初のクライアントからの要求を待たずに Application_Start() を実行させることも可能です。
IIS オート スタート設定による ASP.NET Web アプリケーションの初回実行時のパフォーマンス向上
https://blogs.msdn.microsoft.com/chack/2013/09/25/iis-asp-net-web-2223/> アプリケーションプールはWebサイトA、Bで共有していますが
その理由も何だか分かりませんが、何にせよアプリケーションプールは別々にしないと、片方だけ Application_Start() を実行させるこはできないような気がします。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月7日 7:08
- 回答としてマーク Y.KIKAWA 2017年11月7日 7:12
2017年11月7日 4:38
すべての返信
-
Y.KIKAWA さん、こんにちは。
フォーラム オペレーターの立花楓です。このたびはご投稿いただきましてありがとうございます。
今回、「Visual Studio 共通 フォーラム」 カテゴリに投稿いただいた内容ですが、「Internet Information Services」カテゴリにてご質問いただいたほうが情報が集まりやすいと思いましたので、移動させていただきました。
MSDNフォーラム > Internet Information Services > Internet Information Services
https://social.msdn.microsoft.com/Forums/ja-JP/home?category=iis&filter=alltypes&sort=lastpostdescまた、今後参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いいたします。
よろしくお願いいたします。
MSDN/TechNet Community Support 立花楓
- 編集済み 立花楓Microsoft employee, Moderator 2017年11月7日 7:12
2017年11月7日 1:18モデレータ -
> IISマネージャーで
> ・操作 - Webサイトの管理 - 停止・開始
> を実施した場合は、初回アクセス時に Application_Start() が実施されているようですが、
> コマンド実施を行うとアプリケーションに初回アクセスしても、Application_Start() が実施されず、実際に検証して調べたわけではないのですが、以下の記事によると IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site は同じことのように見えます。
Start or Stop a Web Site (IIS 7)
https://technet.microsoft.com/en-us/library/ea8d442e-9a0c-49bb-b940-50b22fa64dd4自分が持っている本「マイクロソフト公式解説書 一目でわかる IIS7.0」にも、
"Web サイトに対して停止や再起動の操作を行っても、アプリケーションプールに依存するもの、つまりワーカープロセスには影響がない点に注意してください"
とあります。
なので、実は、 IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site どちらも Application_Start() は実行されてないと思われるのですが・・・
> 夜間バッチ処理にて、WebサイトAの停止、起動を
その目的が何だか分かりませんが、単に Application_Start() を定期的に実行させたいということであれば、アプリケーションプールのリサイクルで事足りるのではないでしょうか?
アプリケーションプールのリサイクルは定期的(デフォルトで 1,740 分毎。決まった時間に行うことも可能です。下の画像参照)に行われ、リサイクルの後の最初のクライアントからの要求を受けた時点で Application_Start() は実行されます。
オートスタートという方法もあって、最初のクライアントからの要求を待たずに Application_Start() を実行させることも可能です。
IIS オート スタート設定による ASP.NET Web アプリケーションの初回実行時のパフォーマンス向上
https://blogs.msdn.microsoft.com/chack/2013/09/25/iis-asp-net-web-2223/> アプリケーションプールはWebサイトA、Bで共有していますが
その理由も何だか分かりませんが、何にせよアプリケーションプールは別々にしないと、片方だけ Application_Start() を実行させるこはできないような気がします。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月7日 7:08
- 回答としてマーク Y.KIKAWA 2017年11月7日 7:12
2017年11月7日 4:38 -
サイトの停止は、アプリケーションのアンロードまで行うとは限らないという感じのなのですかね。
もしかすると、単純に停止から再起動まで一定の時間を空ければ、アプリケーションも再起動する動きになるかもしれません。
※今はコマンド連続実行なのであれば
デフォルトだとアプリケーションドメイン単位のアイドルタイムアウトもあった気がしますが、それはオフにしていますかね?(あるいはSurferOnWwwさんが書いているオートスタート設定でアプリが常駐状態になっているなど)
アプリケーション内部からだと、HttpRuntime.UnloadAppDomainというメソッドを呼び出すことで、自らアプリケーション単位で終了することは可能ですが、外部から実行する方法は、少なくともappcmdの機能にはなさそうですね。
なんにしても、個別に管理したいのであれば、すでに書かれていますがアプリケーションプール自体を分けるほうが簡単とは思います。(リソースを共有したいなど明確に目的があって同じにしているならまた話は別ですが)。
ところで、アプリケーションを再起動したいそもそもの目的はなんでしょうか?
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月7日 7:09
2017年11月7日 6:41