ASP.NETをコード変更なしにWindows Azureで動かしてみる
グレープシティが販売しているコンポーネントには、ASP.NET向けの製品が多数あります。
ASP.NET 4で使えるコンポーネント一覧
- ComponentOne Studio for ASP.NET 2010J
- GridView for ASP.NET
- TrueChart for ASP.NET
- Reports for ASP.NET
- Calendar for ASP.NET
- Schedule for ASP.NET
- Accordion for ASP.NET
- Menu for ASP.NET
- NavPanel for ASP.NET
- ToolBar for ASP.NET
- ToolTip for ASP.NET
- TreeView for ASP.NET
- Expander for ASP.NET
- HeaderContent for ASP.NET
- MultiPage for ASP.NET
- Splitter for ASP.NET
- TabControl for ASP.NET
- TabStrip for ASP.NET
- Window for ASP.NET
- ComboBox for ASP.NET
- Editor for ASP.NET
- Input for ASP.NET
- Slider for ASP.NET
- PDF for .NET
- XLS for .NET
- ZIP for .NET
- MultiRow for ASP.NET 1,0J
- SPREAD for ASP.NET 5.0J
- ActiveReports for .NET 6.0J
- InputMan for ASP.NET 3.0J
これら.NET Framework 4上のASP.NETで動作するコンポーネントは、Windows Azureで使えるのでしょうか。
Windows AzureのSDK 1.2までは、WebRoleがHosted Web Core上で動作していましたが、SDK 1.3からIIS(w3wp.exe)上でWebRoleを動作させるモード(フルIISモード)がデフォルトになるなど、従来のASP.NETアプリケ―ションを動かしやすくなっています。そこで今回は、ASP.NET向けのコンポーネントについて、Windows Azureで動作させるためのコード変更なしにWindows Azureで動作させ、その挙動をチェックしてみたいと思います。
なお、基本的に、該当のコンポーネントをASP.NET Webフォームに配置しただけの状態で、コード変更を行わずにWindows Azure上へ配布して動作確認を行いますが、参照設定しているコンポーネントのDLLについては、Windows Azure上へコピーするために参照設定の[ローカルコピー]プロパティを「常にコピーする」に変更しています。
今回の記事は、グレープシティの保証対象外の使い方をしています。また、筆者としても実際の業務アプリケーション構築案件としては未使用のため、業務アプリケーションとしての使用に耐えうるかは未知数です。Windows Azureのアーキテクチャーとグレープシティのコンポーネントの特性を踏まえて「動くかも!」と試してみた結果になりますので、あらかじめご了承ください。
Windows Azureアプリケ―ションの基本的な作り方
Windows Azure SDKを導入したVisual Studio 2010には、テンプレートとして「Cloud」が追加され、Windows Azure Projectが新規作成できるようになっています。
プロジェクトを作成すると、Windows Azure上に設置するロールを選択するダイアログが表示されるので、「ASP.NET Web Role」を選択します。
Windows Azure Projectのテンプレートで新規作成を行うと、2つのプロジェクトが含まれたソリューションが生成されます。試しに実行してみると、「Compute Emulator」と「Storage Emulator」が起動し、その上でWindows Azureアプリケ―ションが動作します(実行には、「SQL Server Express Edition」などローカル実行されているSQL Serverが必要)。
Schedule for ASP.NETのAzure動作検証
ComponentOne Studio for ASP.NETに含まれている多くのASP.NET用コンポーネントの中から、まずは、Schedule for ASP.NETを試してみたいと思います。このコンポーネントは、Outlookの予定表のような画面を、コントロールを貼りつけるだけで実現できるものです。
Schedule for ASP.NETをWindows Azure開発環境で動作させてみる
まず、WebRole側のプロジェクトにaspxファイルを新規追加し、ツールボックスからSchedule for ASP.NETをドラッグ&ドロップします。すると、次のようなデザインが表示されます。
Windows Azureの実環境には、もちろんSchedule for ASP.NETはインストールされていないので、コンポーネントのDLLを一緒に配布しなければなりません。
そこで、「C1.Web.UI.3.dll」と「C1.Web.UI.Control.3.dll」を参照設定して、プロパティウィンドウの「ローカルコピー」欄をTrue
にします(VBの場合、参照設定を指定してプロパティウィンドウに表示するためには、ソリューションエクスプローラで「すべてのファイルを表示」をOn
にする必要があります)。
プログラムコードとしては何も手を加えていない状態ですが、このまま実行してWindows Azure開発環境のEmulatorで動作するかを確認してみると、問題なく動作する事が確認できます。
Schedule for ASP.NETをWindows Azureにデプロイして動作させてみる
ローカル開発環境での実行が確認できたので、ソリューションにあるWindwos Azureプロジェクトを右クリックして[発行]メニューを選択します。発行が完了したら、Windows Azureにアクセスして動作を確認します。
アイコンなども含めて正常に動作していることが確認できました。
SPREAD for ASP.NET 5.0JのAzure動作検証
次は、SPREAD for ASP.NETを試してみます。表計算コンポーネントの定番ともいえるコンポーネントで、Excelとの親和性も高いのが特徴です。
SPREAD for ASP.NETをWindows Azure開発環境で動作させてみる
まず、先ほどの手順と同じように、WebRole側のプロジェクトにaspxファイルを新規追加してツールボックスからSPREAD for ASP.NETをドラッグ&ドロップし、デザイナで次のような画面デザインを定義します。
Windows Azureの実環境にはSPREAD for ASP.NETはインストールされていないので、「fp_client」フォルダをプロジェクトに追加すると共に、次のコンポーネントを参照設定してプロパティウィンドウの「ローカルコピー」欄をTrue
にし、DLLを一緒に配布します(VBの場合、参照設定を指定してプロパティウィンドウに表示するためにはソリューションエクスプローラで「すべてのファイルを表示」をOnにする必要があります)。
- FarPoint.CalcEngine.dll
- FarPoint.Excel.dll
- FarPoint.PDF.dll
- FarPoint.Web.Chart.dll
- FarPoint.Web.Spread.Extender.dll
- FarPoint.Web.SpreadJ.dll
SPREADは、一覧表示系のコンポーネントなので、データセットと連結して複数データを表示してこそ真価を発揮します。実行している環境の環境変数を取得してデータセットに格納するコードを用意し、そのデータセットを表示するためのコードを記述します。
Public Class CZ1102Spread Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load If Not Me.IsPostBack Then Call GetRecords() End If End Sub Private Function GetRecords() As Boolean Dim ds As DataSet Using _proc As New CZ1102DataClass ds = _proc.GetRecords End Using Me.CZ1102_FpSpread.DataSource = ds Me.CZ1102_FpSpread.DataBind() Return True End Function End Class
準備ができたので、Windows Azure開発環境のEmulatorで動作するかを確認してみます。問題なく動作する事が確認できました。
SPREAD for ASP.NETをWindows Azureにデプロイして動作させてみる
ローカル開発環境での実行が確認できたので、ソリューションにあるWindwos Azureプロジェクトを右クリックして[発行]メニューを選択します。発行が完了したら、Windows Azureにアクセスして動作を確認します。
アイコンなども含めて正常に動作していることが確認できました。
ActiveReports for .NET 6.0JのAzure動作検証
ActiveReportsは、日本独自の帳票文化における高い要求を叶えることができる筆者愛用のコンポーネントです。Webアプリケ―ションと言えども、PDFなどで印刷可能な品質の出力機能が求められるときには、必須のコンポーネントです。
ActiveReportsは、以前もWindows Azure上で動作させる方法を紹介しましたが、フルIISモードでどれだけ手間がかからないようになったかを確認したいと思います。
ActiveReportsをWindows Azure開発環境で動作させてみる
フルIISモードになったとしても、Windows Azureの実環境にはActiveReportsはインストールされていないので、WebRole側のプロジェクトで参照設定の追加と各DLLの[ローカルコピー]プロパティをTrue
にする作業を行います。
次に、aspxファイルを新規追加して、ActiveReportsを使ってPDFを返却するページを作成します。
Imports DataDynamics.ActiveReports Imports DataDynamics.ActiveReports.Export.Pdf Public Class CZ1102ActiveReports Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load If Not Me.IsPostBack Then Call GetRecords(False) End If End Sub Private Function GetRecords(ByVal isEmbedFonts As Boolean) As Boolean Using webClient As New System.Net.WebClient Dim userID As String = My.User.Name Dim pdfStream() As Byte Dim pdf() As Byte = System.Text.Encoding.UTF8.GetBytes("%PDF") pdfStream = GetPdfDatas(isEmbedFonts) If pdfStream(0) = pdf(0) AndAlso pdfStream(1) = pdf(1) AndAlso pdfStream(2) = pdf(2) AndAlso pdfStream(3) = pdf(3) Then ' ブラウザに対してPDFドキュメントの適切なビューワを使用するように指定します。 Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "inline; filename=AzureActiveReports.PDF") End If ' 出力ストリームにPDFのストリームを出力します。 Response.BinaryWrite(pdfStream) ' バッファリングされているすべての内容をクライアントへ送信します。 Response.End() End Using Return True End Function ''' <summary> ''' PDFデータを取得する ''' </summary> Private Function GetPdfDatas(ByVal isEmbedFonts As Boolean) As Byte() Dim memStream As System.IO.MemoryStream Dim ds As DataSet Using _proc As New CZ1102DataClass ds = _proc.GetRecords End Using Using _rpt As New CZ1102Reports _rpt.Document.Printer.PrinterName = "" _rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A4 _rpt.PageSettings.Orientation = Document.PageOrientation.Portrait _rpt.PageSettings.Margins.Top = ActiveReport.CmToInch(0.5F) _rpt.PageSettings.Margins.Bottom = ActiveReport.CmToInch(0.5F) 'データを割り当てる _rpt.DataSource = ds.Tables("Enviroment") ' レポートを作成します。 _rpt.Run(False) ' PDFエクスポートオブジェクトを生成します。 Using _pdf = New PdfExport ' PDFの出力用のメモリストリームを作成します。 memStream = New System.IO.MemoryStream 'フォントを非埋め込みにする If Not isEmbedFonts Then _pdf.NeverEmbedFonts = "*" End If ' メモリストリームにPDFエクスポートを行います。 _pdf.Security.Use128Bit = True _pdf.Security.OwnerPassword = "hatsune" _pdf.Security.Permissions = PdfPermissions.AllowPrint _pdf.Security.Encrypt = True _pdf.Export(_rpt.Document, memStream) End Using End Using Return memStream.ToArray() End Function End Class
準備ができたのでWindows Azure開発環境のEmulatorで動作するかを確認してみると、該当のaspxにアクセスすればPDFがダウンロードされ、表示されることが確認できます。
ActiveReportsをWindows Azureにデプロイして動作させてみる
ローカル開発環境での実行が確認できたので、ソリューションにあるWindwos Azureプロジェクトを右クリックして、[発行]メニューを選択します。発行が完了したらWindows Azureにアクセスして、動作を確認します。
文字化けなどもなく、非常にスムーズに開発環境・実環境ともに正常動作しました。前回の苦労が嘘のようです。
MultiRow for ASP.NET 1.0JのAzure動作検証
次に、MultiRow for ASP.NETを試してみます。MultiRow for ASP.NETは、1レコードのデータを複数行表示するコンポーネントです。ASP.NET Webフォームの開発において、通常、RepeaterコントロールとHTMLを駆使して実現していたことを、デザイナーを使って欲しい見た目を素早く実現できるため、デザイン性と生産性を両立できる優れたコンポーネントです。
MultiRow for ASP.NETをWindows Azure開発環境で動作させてみる
まずは、WebRole側のプロジェクトにaspxファイルを新規追加し、ツールボックスからMultiRow for ASP.NETをドラッグ&ドロップして、デザイナで次のような画面デザインを定義します。
今までと同様、Windows Azureの実環境にはMultiRow for ASP.NETがインストールされていないので、コンポーネントのDLLを一緒に配布します。「GrapeCity.Web.MultiRow.dll」と「GrapeCity.Web.MultiRow.resources.dll」を参照設定して、プロパティウィンドウの「ローカルコピー」欄をTrue
にします(VBの場合、参照設定を指定してプロパティウィンドウに表示するためにはソリューションエクスプローラで、「すべてのファイルを表示」をOn
にする必要があります)。
MultiRowは前述のSPREADと同じように一覧表示系のコンポーネントなので、データセットと連結して複数データを表示してこそ真価を発揮します。実行している環境の環境変数を取得して、データセットに格納するコードを用意し、そのデータセットを表示するためのコードを記述します。
Public Class CZ1102MultiRow Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load If Not Me.IsPostBack Then Call GetRecords() End If End Sub Private Function GetRecords() As Boolean Dim ds As DataSet Using _proc As New CZ1102DataClass ds = _proc.GetRecords End Using Me.CZ1102_MultiRow.DataSource = ds Me.CZ1102_MultiRow.DataBind() Return True End Function End Class
準備ができたので、Windows Azure開発環境で実行してみます。すると、デバッグが開始できない旨の表示がでて、実行が停止します。
そこで、「デバッグせずに実行(Ctrl + F5)」で実行したときに表示される詳細なエラーをもとに、次のように「Web.Config」に追記して、エラーを回避します。
<system.web> <httpHandlers> <add path="MRWebResource.axd" verb="GET" type="GrapeCity.Web.MultiRow.MRWebResource" validate="true" /> </httpHandlers> <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" /> <machineKey decryption="AES" …(略)… /> </system.web> <system.webServer> <handlers> <add name="MRWebResource" preCondition="integratedMode" path="MRWebResource.axd" type="GrapeCity.Web.MultiRow.MRWebResource" verb="GET" /> </handlers> <validation validateIntegratedModeConfiguration="false" /> </system.webServer>
この追記によって、無事にWindows Azure開発環境で、MultiRowを使ったASP.NET Webフォームを動作させることができました。
MultiRow for ASP.NETをWindows Azureにデプロイして動作させてみる
Windows Azure開発環境でうまくいったので、さっそくWindows Azure実行環境にデプロイして動作を確認してみます。下の図のように、無事に動作が確認できました。
InputMan for ASP.NET 3.0JのAzure動作検証
InputMan for ASP.NETは、日本の業務シーンで要求されるような入力欄を実現するためのコンポーネントです。SPREAD、ActiveReportsと合わせて「業務アプリをつくるならコレ!」とお勧めできるコンポーネントです。
InputMan for ASP.NETをWindows Azure開発環境で動作させてみる
WebRole側のプロジェクトにaspxファイルを新規追加してツールボックスからInputMan for ASP.NETをドラッグ&ドロップして、デザイナで次のような画面デザインを定義します。
InputMan for ASP.NETに必要なDLLは次の通りです。
- GrapeCity.Web.Input.V30.dll
- GrapeCity.Web.Input.V30.Resource.dll
この2つを参照設定としてプロパティウィンドウの「ローカルコピー」欄をTrue
にします。これで準備ができたので、開発環境で実行するとデバッグが開始できない旨の表示がでて、実行が停止します。
MultiRowの場合と同様に、「Web.Config」にsystem.webServerを追記し、次のように記載することで起動時のエラーは回避できます。
<system.web> <httpHandlers> <add path="IMWebResource.axd" verb="GET" type="GrapeCity.Web.Input.Core.IMWebResource" validate="true" /> </httpHandlers> <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" /> <machineKey decryption="AES" …(略)… /> </system.web> <system.webServer> <handlers> <add name="IMWebResource" preCondition="integratedMode" path="IMWebResource.axd" type="GrapeCity.Web.Input.Core.IMWebResource" verb="GET" /> </handlers> <validation validateIntegratedModeConfiguration="false" /> </system.webServer>
InputMan for ASP.NETをWindows Azureにデプロイして動作させてみる
InputManもデプロイしてWindows Azure実環境での動作を確認してみます。ソリューションエクスプローラで、Windos Azureプロジェクトを右クリックし、[発行]を選んでWindows Azure実環境へデプロイします。
デプロイが完了したら「Windows Azure Activety Log」に表示されているURLにアクセスして、正常動作を確認します。
まとめ
Windows AzureがフルIISモードに対応したことで、以前は手間やノウハウが必要だったASP.NET Webフォームからの移行が、かなり楽になりました。その楽さは、ASP.NET Webフォーム用のコンポーネントを使った場合にも享受できることが、今回の検証で見えてきました。
将来的には、ASP.NET対応のコンポーネントは、WebRole対応と同義に近くなると思います。現状でも、フルIISモードであれば、既存ASP.NET WebフォームのプロジェクトをWindows Azureソリューションに追加し、WebRoleプロジェクトとして登録することで、動作確認できます。このように、比較的少ない手順で、導通テストのようなことができるのも、フルIISモードの利点といえるでしょう。
今回の検証を通し、Windows Azureアプリケ―ション作成において、市販コンポーネントも含め、ASP.NETと近い感覚で開発できる時期が、すぐ近くまで来ているように感じました。