2017年4月21日金曜日

.NET WEBアプリケーションで実行ボタンを押すとアプリケーションエラーになる

.NET WEBアプリケーションにて、トランザクションの実行ボタンを押した後にアプリケーションエラーになる。又、それ以降はメニューのボタンを押しただけでもアプリケーションエラーになる。という事象がありました。

エラーの内容は以下の通りです。



スタックトレースの内容は以下の通りです。

[InvalidOperationException: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded() +2727926
System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding) +61
System.Web.HttpRequest.FillInFormCollection() +148

[HttpException (0x80004005): URL にエンコードされたフォーム データが有効ではありません。]
System.Web.HttpRequest.FillInFormCollection() +206
System.Web.HttpRequest.get_Form() +68
GeneXus.Http.HttpAjaxContext.LoadFormVars(HttpContext localHttpContext) +107
GeneXus.Http.GXHttpHandler.InitPrivates() +153
GeneXus.Http.GXHttpHandler.ProcessRequest(HttpContext httpContext) +157
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

色々調べた所、Microsoft セキュリティ更新プログラム MS11-100が原因でした。これは、ASP.NETに対するサービス拒否攻撃に関する脆弱性対処だそうです。
簡単に言ってしまうと、サーバーにPOSTするデータの数が1000までに制限されています。今回のケースではトランザクションのWebFormに配置してある項目属性の数が多かったためでした。(1000=項目数ではありません。GeneXusが裏側で制御に使っているデータ等も含めての数だと思われます)

対処としては

  1. 画面上の項目数を減らす
  2. Web.configに下記の設定を追加し、制限数を増やす


<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>

但し、(2)に関しては、そもそもの発端が脆弱性に関する対処ですので、制限数を増やしてしまってはセキュリティレベルが下がります。

Webアプリケーションが外部に公開しているものであれば、選択肢は(1)になります。
逆に、社内で利用しているクローズドネットワーク上に配置しているのであれば、(2)もありだと思います。
(それでも社内クライアントが何らかのウイルスに感染して社内サーバーを攻撃し始めた時は防御出来ませんので、そのあたりのセキュリティポリシーを確認の上、対処を決めて下さい。)





2017年4月14日金曜日

デプロイメント方法 - .net webアプリケーション版

以前(といっても8年前になりますが・・時が経つのは早い・・)、.net webアプリケーションのデプロイメント方法の記事をアップしていましたが、リンク切れしていたり、情報が古くなっていましたので、改めてアップします。


.netジェネレーターの場合、デプロイメントツールは標準でインストールされていません。エクステンションモジュールとして追加インストールする必要があります。

1. デプロイメントツールのダウンロード

GeneXusマーケットプレースで公開されています。ダウンロードするためにはGXTechnicalアカウントにてログインが必要です。


CSharp XCopy Deploymentという名前で公開されています。(これはGeneXus社ではなくSimplifica社のArmando作です) Donloadボタンをクリックすると、それぞれのバージョンのモジュールがダウンロード可能です。ダウンロードしたzipファイルを任意のフォルダに解凍します。




2. デプロイメントツールのインストール

2-1.「ツール」→「エクステンションマネージャー」を開く

2-2.「追加」ボタンをクリック

2-3.「ローカル」タブにて、ファイルの選択ボタンをクリックし、解凍したCSharpXCopyDeployment.dllファイルを選択し、「OK」ボタンをクリックします。

2-4. dllの取込みが成功すると、エクステンションマネージャーにて「CSharpXCopyDeployment」が表示されるので、チェックボックスをONにし「変更の適用」をクリックします。適用後にGeneXusを再起動します。  


3. デプロイ

3-1.事前準備
【環境】
GeneXusでは、基本的な考え方としてジェネレート・デプロイするターゲットごとに「環境(Environment)」を作成・設定します。
例えば、「開発サーバー」「本番サーバー」と2系統ジェネレート・デプロイ先があるのであれば、環境も二つ作成し、それぞれ「Dev」「Release」といった判りやすい名前をつけましょう。
手順は以下の通りです。
①ナレッジベースナビゲータにて、「設定」→「環境」を右クリックし、新規環境を選択
②ビルドをする時に、対象となる環境を右クリックし、「アクティブにする」を選択


※本番環境(DB)がGeneXusから直接接続できないケースでは、LAN内のDBを仮の本番DBに見立てて、データベース再編成を実行します。
 この場合、DB再編成プログラムをエクスポートした後、DB接続情報を本番環境の情報に変更します。

※環境についての解説は、GeneXus教育コースでも取扱いがありませんが、開発プロジェクト・運用を考えると非常に大切な機能です。この点については別途エントリーを書くことにします。


4. データベース再編成のエクスポート

4-1.「ツール」→「CSharp Generator」→「Deployment Tools」をクリックし、デプロイメントツールを起動します。

4-2.「Export Reorganization」タブをクリック(ディフォルト表示)

4-3.「Destination folder」に出力先のディレクトリがディフォルト表示されています。
ディレクトリ名は「reorgYYYYMD」(YYYYMDはシステム日付)となっています。
一日に複数回実行する場合は、名前を変更して上書きされないように注意してください。

4-4.「Confirm」ボタンをクリックすると、指定したディレクトリにモジュールがエクスポートされます。



4-5.データベース接続情報の変更
データベース再編成プログラムをエクスポート後にデータベース接続情報を変更したい場合は「GxConfig.exe」というツールを使います。
「GxConfig.exe」はナレッジベースディレクトリ\ターゲットディレクトリ\web\binに出力されています。
標準的な環境では「C:\Models\ナレッジベース名\CSharpModel\web\bin」になります。

4-5-1.「GxConfig.exe」をデータベース再編成がエクスポートされたディレクトリにコピーします。「client.exe.config」ファイルを「web.config」へリネームします。

4-5-2.「GxConfig.exe」を起動すると以下の画面が表示されます。データベース接続情報として、「サーバー名(Server/DS)」「データベース名(Database)」「ユーザー(Name)」「パスワード(Password)」を設定し、保存します。SQLServerへ信頼関係接続(Windows認証)を使う場合は、ユーザーとパスワードを設定する必要はありません。

4-5-3.「web.config」ファイル名を「client.exe.config」へリネームします。
編集が終わったら「GxConfig.exe」は削除しても構いません。(データベース再編成処理の実行には影響ありません)
SQLServerへの認証方法を変更する場合は(SQLServer認証←→Windows認証)、web.configの内容を直接編集します。「Connection-Default-Opts」の設定値を「Integrated Security=yes」または「Integrated Security=no」に変更します。



4-6.データベース再編成の実行
4-6-1.エクスポートしたファイルを全てデプロイ先のデータベースサーバーもしくはデータベースサーバーにネットワーク的に接続可能なサーバー/PCにコピーします。

4-6-2.「Reor.exe」を実行します。
「実行」ボタンをクリックすると、対象データベースに対して、再編成処理が実行されます。

※注意1 データベース再編成処理はDDL(Data Define Language)を実行します。つまり、通常のSQL文(DML)の様にロールバックが効きません。従って、何らかの理由で再編成の途中でエラーが発生した場合は、実行前の状態には自動で戻りません。再編成を行う場合は事前に必ずデータベースのバックアップを行ってください。(GeneXusの制約事項ではなく、DBMSの仕様です)


5. Webアプリケーションのエクスポート

5-1.「ツール」→「CSharp Generator」→「Deployment Tools」をクリックし、デプロイメントツールを起動し、「Web Deployment」タブをクリックします。


5-2.「Destination folder」に出力先のディレクトリがディフォルト表示されています。
ディレクトリ名は「webYYYYMD」(YYYYMDはシステム日付)となっています。
一日に複数回実行する場合は、名前を変更して上書きされないように注意してください。
「Confirm」ボタンをクリックすると指定したディレクトリにモジュールがエクスポートされます。
設定 項目説明
Virtual Directoryデプロイ先でのIISの仮想ディレクトリ名を指定します。
OrverWriteチェックON既に同じ名前で仮想ディレクトリが存在した場合、設定を上書きします。
チェックOFF既に同じ名前で仮想ディレクトリが存在した場合、設定を上書きしません。


5-3.データベース接続情報の変更
データベース再編成と同様に、Webアプリケーションのデータベース接続情報を変更したい場合は「GxConfig.exe」を使います。
WebDeploymentにおける「GxConfig.exe」の実行に関しては、データベース再編成とフォルダ・ファイル構成が違うため、以下の2つの方法があります。
 ① 「web.config」ファイルをbinフォルダ(GxConfig.exeがあるフォルダ)にコピー(移動)し、GxConfig.exeを起動します。(データベース再編成と同様)
   この場合、web.configを修正・保存後にbinフォルダからwebフォルダへ再度コピー(移動)す
る必要があります。

 ②コマンドプロンプトから「GxConfig.exe」を実行する方法
  コマンドプロンプトを開き、WebDeploymentの出力先ディレクトリに移動します。
  「GxConfig.exe」を相対パスで実行します。
※②の方法の場合、「web.config」ファイルをコピー(移動)する必要がありません。

5-4.Webアプリケーションのデプロイ
エクスポートしたファイルをディレクトリごとコピーし、デプロイ先のサーバー/PCへ配置します。
デプロイフォルダにある「createVirtualDirectory.bat」を実行します。


エクスポート時に指定したVirtusl Directory名で仮想ディレクトリが作成されます。
又、仮想ディレクトリ作成後、ブラウザが自動的に起動し開発者メニューが表示されます。