→.NETプログラミング
→Webアプリ開発
→ネットワーク関連
→.NETネットワークプログラミング
→Web技術関連
→ASP.NETでのWebサービス開発に関するメモ
→ASP.NET AJAX関連
ASP.NET一般†
ASP.NET Core†
ASP.NETの構成要素†
- アプリケーション・ルート
- IISの特別な仮想ディレクトリ(通常の仮想ディレクトリとは異なる模様)
- aspxファイル、Global.asax, Web.configを保持する
- アプリケーション・ルートの作成手順
- 管理ツールを起動し、IISのスナップインを起動する。
- Webサイトを右クリック→新規作成→仮想ディレクトリをクリック
- 仮想ディレクトリ作成ウィザードが起動する
- エイリアスを入力。MyWebApp にすると http://localhost/MyWebApp でアプリケーションにアクセスできる
- サーバ機上のフォルダを指定する。通常は c:\Inetpub\wwwroot の下あたりに作る
- アクセス許可の設定をする。「読み取り」と「ASPなどのスクリプトを実行する」を許可する
- Global.asax
- System.Web.HttpApplicationクラスから派生したGlobalクラス
- アプリケーションやセッションの前処理・後処理などを記述する
- アプリケーションスコープ、セッションスコープで使うクラスの作成
- グローバルに使いたい名前空間を指定する
- using System.Configurationする必要あり
- 「_vti_cnf」、「_vti_pvt」って何?
- FrontPage 2000では、フォルダをWebの世界のように処理するので、それを実現するために自動的に作られるものと思われます。
- 以前に「forum」にて、これらのフォルダはホームページサーバーに必要かどうかとの質問がありました。当時私はまだFrontPage 2000を入手していなかったので答えられませんでした。しかし、実際に私もFrontPage 2000を購入して分析してみると、これらの謎のフォルダはホームページサーバーに転送する必要はないことがわかりました。
ASP.NETのデプロイメント(展開)†
手動でやる場合†
- アプリケーションルートの割り当てが必要
- アプリ用のaspx,asmxファイルがあること
- アプリケーションルートにWeb.config, Global.asaxがあること
- binディレクトリに該当アプリのdllがあること
- その他、動作に必要なdllがあるなら、それが見つかるようにパスが通っていること
セットアップを作る場合†
→Visual Studio.NETによるセットアッププロジェクト
注意点:正しくセットアップしてあるのに404エラー(ページが見つかりません)になる場合†
- IIS6ではデフォルトでASP.NETの実行が禁止されているので注意
- IISマネージャーの「Webサービス拡張」を確認し、ASP.NETが禁止されていたら許可すること
asmxにアクセスすると「'/xxxx' アプリケーションでサーバー エラーが発生しました。」というエラーになるケース†
- ASP.NET 2.0で作ったのにIIS側がASP.NET 1.1で動いているとこうなる。
- IISマネージャの該当サイトのプロパティで「ASP.NET」のタブを表示し、ASP.NETバージョンを変更すると直る
asmxにアクセスすると「XMLページを表示できません」というエラーになるケース†
- なお、これをやっても「メタベースにアクセスできません」とか言うエラーになる場合がある。この場合、
aspnet_regiis -ua
をやってから
aspnet_regiis -i
したら直った。
- あと、IEがページをキャッシュしているせいか?エラーが直っているのにエラー画面が出続けるケースもあるようなので注意。
ASP.NETの設定†
- 注意点:デバッグするときにはキープアライブを有効にする必要がある
- IDEでデバッグしたいときはIISマネージャの規定のWebサイトの「Webサイト」タブにある「HTTPキープアライブを有効にする」チェックボックスを有効にしておかないと起動できない。
- また、Web.configのcompilationタグのdebug属性をtrueにして置く必要がある。ただしこれをtrueにしたままだとメモリのフラグメンテーションが起こりやすくなるので、本番運用時にはfalseにした方が良い
OutOfMemoryExceptionが発生する場合†
- OutOfMemoryExceptionを事前に察知
- System.Runtime.MemoryFailPoint クラスを使う
- コンストラクタ でメモリーサイズ ( 単位はMB ) を指定します。指定したサイズのメモリーが使用できない場合は、InsufficientMemoryException クラス (System) がコンストラクタからスローされます。
- なお、使用後は必ず Dispose メソッド を呼び出す必要があることに注意します。 (
- OutOfMemoryExceptionの発生について
- IIS 6 では、ワーカープロセスが使用する最大メモリが設定(制限)されていません。(IIS 5では初期値で60%制限済み)
- 運用環境に 4 GB の RAM が実装されているときは、プロセス用仮想アドレス空間の利用可能限界値 (2GB) を超える可能性があり、アクセスが集中した高負荷の稼働状況により2GB を超え OutOfMemoryException の発生が考えられます。
- 4 GB の RAM が実装されている運用環境では、より安定した稼働のため積極的にメモリ制限によるリサイクルを設定します。
- IIS 6 では、IIS マネージャのアプリケーションプール・プロパティ「リサイクル」内 メモリのリサイクルにある[最大使用メモリ] (メガバイト単位) の設定を使って、ワーカープロセスが使用する最大メモリを設定(制限)できます。
- この設定により、ワーカープロセスの使用する最大メモリが設定値に達するとリサイクルを自動的に行いメモリの解放を行うことで OutOfMemoryException を回避できます。この場合、2Gのうち部分的にシステム領域として利用されることを考慮して経験的に60%程度にすることが推称されています。
- ※「メモリのリサイクル」の設定を仮想メモリ、使用メモリともに2GBの60%→1200MBに設定する
- 参考:http://support.microsoft.com/kb/820108/
- 参考:.NETアプリケーションのパフォーマンスとチューニング
- System.OutOfMemoryExceptionの発生
- タスクマネージャにて、ASP.NET のホストプロセス (aspnet_wp.exe または w3wp.exe) のメモリ使用量 (パフォーマンスモニタ、 Process の Workingset) を確認してみてください。
- 32bit Windows で動作するプロセスは全て、プロセスひとつあたりユーザー領域が 2GB、システム領域が 2GB に制限されています(/3GB オプションを使用し、3GB : 1GB に変更する事は可能です)。これは物理メモリ、スワップファイルの有無やサイズとは関連しません。Windows のメモリ管理機能の詳細は Inside Windows などの書籍が詳しいと思います。
- ASP.NET のホストプロセスの場合、だいたい使用メモリ量 800MB あたりから OutOfMemoryException が発生しはじめ(OutOfMemoryException ではホストプロセスは強制終了しません)、1GB を超えたあたりから GC のオーバーヘッドで CPU が 100% に貼りつきはじめると思います。
- 使用メモリ量が 1GB を超えてしまっている場合は、アプリケーションの実装(セッション変数に大きなデータセットを格納している、trace を有効にして多数のリクエストを記録しているなど)の可能性が高いと思います。データセットはシリアライズすると元の数倍から数十倍も大きなサイズになりますので、セッション変数に格納する時は注意した方がいいと思います。
- この目安を下回るのに OutOfMemoryException が発生している場合は、web.config の compilation の debug 属性を false にしてみてください。ほとんどの場合はこれで解決すると思います。.NET は JIT コンパイルしたマシンコードをメモリ上に配置しますので、プロセスに読み込まれているアセンブリ数が増えるとメモリが断片化しやすい特性を持つようです。 debug が true の場合、元々デバッグ版なのでパフォーマンスが劣る上に、Temporary ASP.NET Files の下に生成される実行時用のアセンブリが個別コンパイルモード(aspx ひとつあたり dll がひとつ) になるので、かなり早い段階で OutOfMemoryException が発生すると思います。
ASP.NETのテンポラリファイル†
POSTで渡って来たデータの取得†
DIVタグの表示/非表示の切り替え†
- divタグに id属性とrunat="server"属性を追加
- プログラム側でid属性の名前で参照可能になるので .Visibleプロパティにtrue/falseセットしてやる
なぜか発行がうまく行かないとき†
- サービスの管理で「World Wide Web Publishing Service」を再起動してみる
- ソリューションを右クリック→「Webサイトのコピー」をやってみてうまくいくか調べる
- うまく行かない場合「ログの表示」ボタンを押してログを表示してみると原因がわかることがある
- ※実際問題、VS.NET 2005の発行の機能はかなり動きが怪しいため、あまり信用せず手動コピーで動かすことを考えた方がいいのかも知れない