.NETプログラミング

Webアプリ開発

ネットワーク関連

.NETネットワークプログラミング

Web技術関連

Webサービス/SOAP

ASP.NETでのWebサービス開発に関するメモ

ASP.NET AJAX関連

ASP.NET一般

ASP.NETの構成要素

  • アプリケーション・ルート
    • IISの特別な仮想ディレクトリ(通常の仮想ディレクトリとは異なる模様)
    • aspxファイル、Global.asax, Web.configを保持する
  • アプリケーション・ルートの作成手順
    • 管理ツールを起動し、IISのスナップインを起動する。
    • Webサイトを右クリック→新規作成→仮想ディレクトリをクリック
    • 仮想ディレクトリ作成ウィザードが起動する
    • エイリアスを入力。MyWebApp にすると http://localhost/MyWebApp でアプリケーションにアクセスできる
    • サーバ機上のフォルダを指定する。通常は c:\Inetpub\wwwroot の下あたりに作る
    • アクセス許可の設定をする。「読み取り」と「ASPなどのスクリプトを実行する」を許可する
  • Global.asax
    • System.Web.HttpApplicationクラスから派生したGlobalクラス
    • アプリケーションやセッションの前処理・後処理などを記述する
      • アプリケーションスコープ、セッションスコープで使うクラスの作成
    • グローバルに使いたい名前空間を指定する
  • Web.config
    • ASP.NETのアプリケーションローカルレベルの設定を記述するファイル
    • オプションであり、無くても動作は可能。無い場合はmachine.configの設定で動作する
    • 認証の設定などが可能
    • アプリケーション固有の情報をappSettingsセクションに保持できる
       // .NET 1.1の場合
       s = ConfigurationSettings.AppSettings["myConfigKey"]; //AppSettingsはNameValueCollection型のプロパティ
       // .NET 2.0の場合
       s = ConfigurationManager.AppSettings["myConfigKey"]; 
      のようにしてアクセス可能。また途中で変更された場合は自動的に再ロードする。レジストリを使うよりこちらの方が楽だが、セキュリティ面に注意する必要がある。
  • using System.Configurationする必要あり
  • Web.config側記述例
     <appSettings>
       <add key="pubs" value="server=(local)\NetSDK;database=pubs;Trusted_Connection=yes" />
       <add key="northwind" value="server=(local)\NetSDK;database=pubs;Trusted_Connection=yes" />
     </appSettings>
    • configureationタグの中に書く
  • 「_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' アプリケーションでサーバー エラーが発生しました。」というエラーになるケース

  • 以下のようなメッセージが出る
     解析エラー メッセージ: 型 'HogeService' を作成できませんでした。
  • ASP.NET 2.0で作ったのにIIS側がASP.NET 1.1で動いているとこうなる。
  • IISマネージャの該当サイトのプロパティで「ASP.NET」のタブを表示し、ASP.NETバージョンを変更すると直る

asmxにアクセスすると「XMLページを表示できません」というエラーになるケース

  • 以下のようなエラーになり、ASP.NETが実行できないという現象
    XML ページを表示できません 
    XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してくださ
    い。 [更新] ボタンをクリックするか、または後でやり直してください。 
    
    --------------------------------------------------------------------------------
    
    無効な文字で名前が始まりました。リソース 'http://localhost/xxx.aspx' の実行エラーです。ライン 1、位置 2 
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="xxx.aspx.cs" Inherits="_Default" %>
  • これは、複数の.NET Frameworkをインストールしたり、Visual Studio.NETの後にIISをインストールしたりすると起きるらしい。
  • 対応方法は以下の通り
    • コマンドプロンプトから以下のディレクトリへ移動する。(Framework1.1の場合)
      C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
    • 以下のコマンドを実行する
      aspnet_regiis -i
  • なお、これをやっても「メタベースにアクセスできません」とか言うエラーになる場合がある。この場合、
    aspnet_regiis -ua
    をやってから
    aspnet_regiis -i
    したら直った。
  • あと、IEがページをキャッシュしているせいか?エラーが直っているのにエラー画面が出続けるケースもあるようなので注意。

ASP.NETの設定

  • ASP.NETへのリクエストサイズの上限
    Web.config等をいじってない場合、ASP.NETはリクエストのサイズが4MB以上だと
    リクエストを拒否するようになっているはずです。
    /configuration/system.web/httpRuntime要素のmaxRequestLength値を変更すれば
    リクエストを受け付けることはできます。
    
    ただ、5MBのデータを送信するとなるとファイアウォール、プロキシ(リバース)、
    IDSなどに引っかかる可能性があります。
    そもそも5MBのデータをサーバに送信すること自体かなり辛いし、ViewState自体は
    XMLだったはずなので、5MBのXMLを処理するのは結構負荷がかかりそうですね… 
  • Web.config
    • アプリケーション個別の設定は Web.config というXMLファイルに記録される
    • ASP.NETが動作するフォルダに置く必要がある(未確認)
    • Web.configは親フォルダでの構成ファイルの設定を上書きする
    • @Pageディレクティブを使ってページ単位で設定の上書きをすることも可能
    • タイムアウトについて。参考:http://www.one-side.net/~chaki/?p=448
      変更する方法は、web.configの中の<system.web>内に、
      <httpRuntime executionTimeout=”1800″/>
      を追加してやる。 (この例の場合は1800秒なので30分)
      • ただしcompilationタグのdebug="true"の場合はこの設定は無視されるので注意
      • タイムアウトしてしまうとThreadAbortException が発生し「スレッドを中止しようとしました」のメッセージが出る
      • デフォルトでは110秒でタイムアウトする
  • ASP.NET全般の設定
    • 以下のXMLファイルに全般的な設定が記録されている
      C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config
  • 注意点:デバッグするときにはキープアライブを有効にする必要がある
    • 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アプリケーションのパフォーマンスとチューニング
  • ASP.NETのmemoryLimitの上限が800MBまでの理由について
    • 1. プロセスは仮想アドレス空間(2GB)上限など気にせず、メモリが必要なった場合に必要なだけメモリを確保しようとする(OSに要求する?)
    • 2. 既定の設定ではプロセスに割り当てられる仮想アドレス空間は2GB、これを超えてアクセスしようとするとOSがエラーを発生させる(OutOfMemoryException?)
    • 3. 物理RAM4GBで、memoryLimit=60(%)だと2.4GBまでキャッシュマネージャ(?)がSystem.Web.Caching.Cacheからアイテムを削除しない
    • 4. System.Web.Caching.Cacheが仮想アドレス空間の上限2.0GB当たりまでメモリを確保し続けると2.に当たりOutOfMemoryExceptionが発生する
    • よってタイトルに書いたように別に800MBが上限ではなく、仮想アドレス空間を越えないように物理RAMとmemoryLimitが調整されれば良いのかなと思いました。ということは物理RAM4GBでmemoryLimit=50(%)でぴったり上限2GBに収まるので、この設定でも問題なさそうな気がします
    • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/monitor_perf.asp
  • 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のテンポラリファイル

  • ASP.NETの中で以下のようにしてテンポラリファイル用のフォルダを得ようとしてみたら
    Module mod = Assembly.GetExecutingAssembly().GetModules()[0];
    String tmpPath = Path.GetDirectoryName(mod.FullyQualifiedName);
  • ↓のような場所が帰ってくるので注意
    C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files
  • 素直にPath.GetTempPath()した方がよさそう

POSTで渡って来たデータの取得

  • PageクラスのRequest.Formプロパティを参照する
     for (int i = 0; i < Request.Form.Count; i++)
     {
       String key = Request.Form.Keys[i];
       String val = Request.Form[i];
    
       Debug.WriteLine("key=" + key + ",val=" + val);
     }

DIVタグの表示/非表示の切り替え

  • divタグに id属性とrunat="server"属性を追加
  • プログラム側でid属性の名前で参照可能になるので .Visibleプロパティにtrue/falseセットしてやる

なぜか発行がうまく行かないとき

  • サービスの管理で「World Wide Web Publishing Service」を再起動してみる
  • ソリューションを右クリック→「Webサイトのコピー」をやってみてうまくいくか調べる
  • うまく行かない場合「ログの表示」ボタンを押してログを表示してみると原因がわかることがある
  • ※実際問題、VS.NET 2005の発行の機能はかなり動きが怪しいため、あまり信用せず手動コピーで動かすことを考えた方がいいのかも知れない

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-12-29 (日) 17:40:13 (495d)