このトピックでは、実行時にページレポートをJSONデータソースに接続し、正当なアクセス資格を使用してWebサービスからデータを取得する方法を紹介します。
メモ:
- 使用するマシンにIIS Expressがインストールされていることが必要になります。
- このトピックでは、Customersサンプルデータファイルを使用しています。使用にはcustomers.jsonファイル(..\ActiveReportsNET16\Samples\Data\customers.json)へのアクセス権限が必要です。
以下の手順を完了すると、次のようなレポートが作成されます。
デザイン時のレイアウト
実行時のレイアウト
Visual StudioプロジェクトにActiveReportsを追加する
- Visual Studioで新しいプロジェクトを開きます([ファイル]メニューから[新規作成]、[プロジェクト]を選択)。
- [新しいプロジェクト]ダイアログが表示されます。[ActiveReports16.0J ページレポート アプリケーション]を選択し、ファイル名を「CustomerDetails」に変更します。
- [OK]ボタンをクリックすると、ActiveReports16 ページレポートアプリケーションが新規作成されます。デフォルトでページレポートがプロジェクトに追加されています。
- [ソリューションエクスプローラー]で、ページレポートのファイル名を「Customers.rdlx」に変更します。
レポートレイアウトの追加については、「クイックスタート」を参照してください。
レポートをデータソースに接続する
- [レポートエクスプローラ]で、[データソース]ノードを右クリックして[データソースの追加]を選択するか、[追加](+)ボタンをクリックして[データソース]を選択します。
- 表示される[レポートデータソース]ダイアログの[全般]ページで、データソースの名前を入力します。
- [種類]フィールドで「Json Provider」を選択します。
- 同じページの[スキーマ]タブで、ラジオボタンから[埋め込み]を選択し、その下の欄に埋め込むスキーマを次のように入力します。
JSONスキーマ |
コードのコピー
|
{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "Customers": { "type": "array", "items": { "type": "object", "properties": { "Id": { "type": "string" }, "CompanyName": { "type": "string" }, "ContactName": { "type": "string" }, "ContactTitle": { "type": "string" }, "Address": { "type": "string" }, "City": { "type": "string" }, "PostalCode": { "type": "string" }, "Country": { "type": "string" }, "Phone": { "type": "string" }, "Fax": { "type": "string" } }, "required": [ "Id", "CompanyName", "ContactName", "ContactTitle", "Address", "City", "PostalCode", "Country", "Phone", "Fax" ] } }, "ResponseStatus": { "type": "object", "properties": {} } }, "required": [ "Customers", "ResponseStatus" ] }
|
- [OK]ボタンをクリックしてデータソース接続を保存します。
データセットを追加する
- [レポートエクスプローラ]で、追加したデータソースのノードを右クリックして[データセットの追加]を選択するか、[追加](+)ボタンをクリックして[データセット]を選択します。
- 表示される[データセット]ダイアログで、[全般]ページを選択し、データセットの名前として「顧客」と入力します。
- [クエリ]ページで、[クエリ]の横にある[JSONクエリデザイナで編集する]ボタンをクリックします。表示される[JSONクエリデザイナ]で
[*]
を選択し、[OK]ボタンをクリックすると、[クエリ]テキストボックスに次のようなクエリが得られます。
$.Customers[*]
- [OK]ボタンをクリックしてダイアログを閉じます。データセットとクエリで作成したフィールドが子ノードとして[レポートエクスプローラ]に表示されます。
レポートにコントロールを追加する
-
[レポートエクスプローラ]の[顧客]データセットのノードを開き、Idフィールドをドラッグしてレポートのデザイナ面へドロップし、[プロパティ]ウィンドウへと移動して各プロパティを次のように設定します。
プロパティ名 |
プロパティの値 |
Location |
0.375in, 0.25in |
FontSize |
14pt |
FontStyle |
Italic |
Size |
4in, 0.375in |
-
[ツールボックス]から、Tableデータ領域をドラッグして、デザイナ面へドロップし、[プロパティ]ウィンドウへと移動して各プロパティを次のように設定します。
プロパティ名 |
プロパティの値 |
Location |
0.375in, 1in |
Size |
4.5in, 1.125in |
FixedSize |
4.5in, 1.125in
|
- このTableの左側にある行ハンドルのいずれかを右クリックし、[テーブルのフッタ]を選択してテーブルフッタ行を削除します。
- ポインタをTexBox5上でホバーさせると、フィールド選択用アイコン(五本線の入ったアイコン)が表れます。これをクリックして表示されるフィールドのリストから[CompayName]フィールドを選択します。これにより、テーブルヘッダ行に静的なラベルが自動で追加されます。追加された静的なラベルを選択して、[プロパティ]ウィンドウへ移動し、Valueプロパティを「会社名」に変更します。
- ポインタをTexBox6上でホバーさせると、フィールド選択用アイコンが表れます。これをクリックして表示されるフィールドのリストから[ContactName]フィールドを選択します。これにより、テーブルヘッダ行に静的なラベルが自動で追加されます。追加された静的なラベルを選択して、[プロパティ]ウィンドウへ移動し、Valueプロパティを「担当者」に変更します。
- ポインタをTexBox7上でホバーさせると、フィールド選択用アイコンが表れます。これをクリックして表示されるフィールドのリストから[Address]フィールドを選択します。これにより、テーブルヘッダ行に静的なラベルが自動で追加されます。追加された静的なラベルを選択して、[プロパティ]ウィンドウへ移動し、Valueプロパティを「住所」に変更します。
ビューワにレポートを表示する
- [ソリューションエクスプローラー]からForm1を開きます。
- Form1のタイトルバーをダブルクリックして、Form1_Loadイベントのイベント処理メソッドを作成します。
- レポートにデータをロードし、ビューワにレポートを表示するために、Form1.cs内のInitializeComponentメソッドの後に次のコードをペーストします。
Form1.cs |
コードのコピー
|
// レポートに妥当なデータを返す<see cref="PageDocument.LocateDataSource"/>のハンドラ
private void OnLocateDataSource(object sender, GrapeCity.ActiveReports.LocateDataSourceEventArgs args)
{
object data = null;
var dataSourceName = args.DataSourceName;
var source = new DataLayer();
if (dataSourceName == "DataSource1")
{
data = source.CreateData();
}
args.Data = data;
}
// レポートをロードして表示します。
private void Form1_Load(object sender, EventArgs e)
{
var rptPath = new System.IO.FileInfo(@"..\..\Customers.rdlx");
var definition = new GrapeCity.ActiveReports.PageReport(rptPath);
definition.Document.LocateDataSource += OnLocateDataSource;
viewer1.LoadDocument(definition.Document);
}
|
Webサービスをプロジェクトに追加する
このWebサービスは、プロジェクトに追加すると、JSONデータへのアクセス認証を行います。
- [ファイル]メニューから[追加]、[新しいプロジェクト]を選択します。
- 表示される[新しいプロジェクトの追加]ダイアログで、ASP.NET Webアプリケーションを選択し、[名前]フィールドを「WebService」に変更します。
- [OK]ボタンをクリックして、新しいプロジェクトを追加します。
- 表示される[新しいASP.NETプロジェクト]ダイアログで、「Empty」テンプレートを選択して[OK]をクリックします。
- [ソリューションエクスプローラー]で[WebService]ノードを右クリックして、[追加]、[クラス]を選択します。
- 表示される[新しい項目の追加]ダイアログで、[クラス]を選択して、[名前]フィールドで名前を「BasicAuthHttpModule.cs」に変更します。
- [追加]ボタンをクリックして、新しいクラスをプロジェクトに追加します。
- BasicAuthHttpModuleクラスファイルが開かれます。次のコードをWebService名前空間の中に追加します。
BasicAuthHttpModule.cs |
コードのコピー
|
namespace WebService { public class BasicAuthHttpModule : IHttpModule { private const string Realm = "My Realm"; public void Init(HttpApplication context) { // イベントハンドラを登録します。 context.AuthenticateRequest += OnApplicationAuthenticateRequest; context.EndRequest += OnApplicationEndRequest; } private static void SetPrincipal(System.Security.Principal.IPrincipal principal) { System.Threading.Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } } // ユーザー名とパスワードを検証します。 private static bool CheckPassword(string username, string password) { return username == "admin" && password == "1"; } private static void AuthenticateUser(string credentials) { try { var encoding = System.Text.Encoding.GetEncoding("iso-8859-1"); credentials = encoding.GetString(Convert.FromBase64String(credentials)); int separator = credentials.IndexOf(':'); string name = credentials.Substring(0, separator); string password = credentials.Substring(separator + 1); if (CheckPassword(name, password)) { var identity = new System.Security.Principal.GenericIdentity(name); SetPrincipal(new System.Security.Principal.GenericPrincipal(identity, null)); } else { // ユーザー名またはパスワードに誤りがあります。 HttpContext.Current.Response.StatusCode = 403; } } catch (FormatException) { // 資格情報は正しく設定されませんでした。 HttpContext.Current.Response.StatusCode = 401; } } private static void OnApplicationAuthenticateRequest(object sender, EventArgs e) { var request = HttpContext.Current.Request; System.IO.FileInfo info = new System.IO.FileInfo(request.Url.AbsolutePath); if (!info.Name.Equals("GetJson")) return; var authHeader = request.Headers["Authorization"]; if (authHeader != null) { var authHeaderVal = System.Net.Http.Headers.AuthenticationHeaderValue.Parse(authHeader); // スキーム名RFC 2617 sec 1.2は大文字小文字を区別しません。 if (authHeaderVal.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) && authHeaderVal.Parameter != null) { AuthenticateUser(authHeaderVal.Parameter); } } else { HttpContext.Current.Response.StatusCode = 401; } } // リクエストが不正な場合は、応答に対してWWW-Authenticateヘッダ // を追加します。 private static void OnApplicationEndRequest(object sender, EventArgs e) { var response = HttpContext.Current.Response; if (response.StatusCode == 401) { response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", Realm)); } } public void Dispose() { } } }
|
- [ソリューションエクスプローラー]でWebServiceプロジェクトを右クリックして、[追加]、[参照]を選択し、System.Net.Httpの参照を追加します。
- [ソリューションエクスプローラー]で、[WebService]ノードを右クリックして、[追加]、[新しい項目]を選択します。
- 表示される[新しい項目の追加]ダイアログで、[Webサービス(ASMX)]を選択して、[名前]フィールドの名前を「Service.asmx」に変更します。
- [追加]ボタンをクリックして、プロジェクトに新しいサービスを追加します。
- 表示されるServiceファイルで、[System.Web.Script.Services.ScriptService]のコメントを解除し、WebMethodの下に次のコードを追加します。
Service.asmx.cs |
コードのコピー
|
[System.Web.Script.Services.ScriptMethod(UseHttpGet = true, ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)] public string GetJson() { string result; try { using (System.IO.StreamReader streamReader = new System.IO.StreamReader(Properties.Resource.JsonFilePath, System.Text.Encoding.UTF8)) { result = streamReader.ReadToEnd(); } } catch (System.IO.FileNotFoundException e) { var errorMessage = String.Format(Properties.Resource.FormatErrorMessage, e.Message, e.StackTrace); result = "{'error': '" + errorMessage + "'}"; } return result; }
|
- [ソリューションエクスプローラー]で、[WebService]ノードを右クリックして、[追加]、[新しい項目]を選択します。
- 表示される[新しい項目の追加]ダイアログで、[Webフォーム]を選択して、[名前]フィールドで名前を「default.aspx」に変更します。
- [追加]ボタンをクリックして、新しいファイルをプロジェクトに追加します。
- 表示されるdefault.aspxコードファイルで、次のように<div>タグを<form>タグに替えます。
default.aspx |
コードのコピー
|
<form id="form1" runat="server"> <asp:Label ID="messageLabel" runat="server" Text=""></asp:Label> </form>
|
- [ソリューションエクスプローラー]で、[default.aspx]を右クリックして、[コードの表示]を選択します。
- 表示される[default.aspx]コードファイルで、Page_Loadイベントに次のコードを追加します。
default.aspx.cs |
コードのコピー
|
messageLabel.Text = Properties.Resource.bodyOfMessage;
|
- [ソリューションエクスプローラー]で、[WebService]ノードを右クリックして、[追加]、[新しい項目]を選択します。
- 表示される[新しい項目の追加]ダイアログで、[リソースファイル]を選択して、[名前]フィールドで名前を「Resource.resx」に変更します。
- [追加]ボタンをクリックして、プロジェクトに新しいファイルを追加します。Resources.resxファイルを[WebService]>[Properties]ノードの下にドラッグします。
- Resource.resxファイルに次のデータを追加します。
名前 |
値 |
bodyOfMessage |
Json Data SourceサンプルWebServiceが正常に開始されました |
FormatErrorMessage |
Message : {0}, StackTrace: {1} |
JsonFilePath |
<User folder>\ActiveReportsNET16\Samples\Data\customers.json |
- [ソリューションエクスプローラー]でソリューションのノードを右クリックして、[プロパティ]を選択します。
- 表示される[ソリューション'CustomerDetails'プロパティページ]ダイアログで、ラジオボタンで[マルチ スタートアップ プロジェクト]を選択し、[アクション]のドロップダウンから2つのプロジェクトに対して[開始]を選択します。
- [適用]、[OK]をクリックして、ソリューションに追加した変更を適用します。
- [ソリューションエクスプローラー]で、CustomerDetailsプロジェクトを右クリックして、[追加]、[参照]を選択し、System.Web.Extentionsの参照を追加します。
DataLayerクラスを追加する
DataLayerクラスはこのチュートリアルで使用するデータを提供します。
- [ソリューションエクスプローラー]でCustomerDetailsプロジェクトを右クリックして、[追加]、[クラス]を選択します。
- 表示される[新しい項目の追加]ダイアログで、[クラス]を選択して、「名前」フィールドで名前を「DataLayer.cs」に変更します。
- [追加]ボタンをクリックして新たなクラスをプロジェクトに追加します。
- 表示されるDataLayerクラスファイルで、このプロジェクトの名前空間の内部に次のコードを追加します。
注意: "source_url"に設定しているURL中のポート番号("http://localhost:"の後ろの部分)は、IIS Expressが実際に使用するポート番号に変更する必要があります。IIS Expressが使用するポート番号は、WebServiceプロジェクトのプロパティページで確認・変更することができます。
DataLayer.cs |
コードのコピー
|
// このサンプルで使用するデータを提供します
internal sealed class DataLayer { public String CreateData() { string source_url = @"http://localhost:6719/Service.asmx/GetJson"; string responseText = null; using (var webClient = new System.Net.WebClient()) { webClient.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("admin:1")); // username:password webClient.Headers[System.Net.HttpRequestHeader.ContentType] = "application/json;"; webClient.Encoding = System.Text.Encoding.UTF8; var responseJson = webClient.DownloadString(source_url); Dictionary<string, string> values = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Dictionary<string, string>>(responseJson); if (values.ContainsKey("d")) { responseText = values["d"]; } } return responseText; } }
|
Web.configファイルを設定する
- [ソリューションエクスプローラー]で、WebServiceプロジェクト内のWeb.configファイルを開きます。
- <configuration>タグを次のコードに置き換えます。
Web.config |
コードのコピー
|
<configuration> <system.web> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> <httpModules> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/> </httpModules> <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> <add name="HttpSoap"/> </protocols> </webServices> </system.web> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/> </compilers> </system.codedom> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <add name="BasicAuthHttpModule" type="WebService.BasicAuthHttpModule, WebService"/> <remove name="ApplicationInsightsWebTracking"/> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler"/> </modules> </system.webServer> </configuration>
|
レポートを表示する
- [ビルド]メニューから[ソリューションのビルド]を選択します。
- [F5]ボタンを押してプロジェクトを実行します。
関連トピック