ASP.NET Web APIでデータ蓄積の5回目です。前回まででMVC個別に注目してASP.NET Web APIの開発方法を確認しました。今回からやっとASP.NET APIテンプレートを元にデータ蓄積の処理を構築してみます。前回も書きましたが、最初からテンプレートを使うと何をどうしていいか分かりずらい場合があると思ったからです。その前段階として前回までの内容を書きました。今回はテンプレートにモデルとコントローラを追加するあたりまで書きます。
実際のプロジェクト一式は以下です。(※単なるサンプルプログラムです。ご利用による不具合、不利益等について弊社は一切責任を負わないものとします。)
Visual Studio Community 2013でのプロジェクト一式
プロジェクトの作成
それでは、まずプロジェクトの作成からです。
Visual Studio(ここでは Visual Studio Commnunity 2013です。) でプロジェクトを作成します。
[ファイル] -> [新規作成] -> [プロジェクト] の順にクリックします。以下のスクリーンショットのようにここではテンプレートのVisual C#で、WebからASP.NET Webアプリケーションを選択します。任意のプロジェクト名を入力してOKで進みます。
次にここでWeb APIのテンプレートを選択するのですが、その前に認証の変更で「認証なし」に変更します。もちろん認証も重要なテーマですが、ここでは「データ蓄積処理」をテーマにするために「認証なし」に変更します。
これで改めてWeb APIのテンプレートの選択してプロジェクトを生成します。
テンプレートの動作確認
まず、以下のようなプロジェクトのフォルダ、ファイル構成になっていると思います。もし、IdentityやUser等に関するフォルダやファイルが生成されている場合は、認証が有効になっていると思いますので再度作成した方がいいと思います。
生成されたプロジェクトを何もしないでビルドします。問題なくビルド出来ると思いますのでそのままデバッグなしで開始します。以下のような画面になると思います。
今回の場合は、ASP.NET MVCのフォルダやファイルも生成されているのでこのような表示になります。
今回は使いませんが、このデフォルトは以下のファイルで設定されています。
App_Startフォルダ → RouteConfig.cs
上記ファイルでASP.NET MVCフレームワークのController(System.Web.Mvc.Controllerクラス)であるHomeControllerがデフォルトに設定されているので、Controllersフォルダ配下のHomeController.csがアプリケーション起動時に呼び出されます。
Web APIのルーティンは以下のファイルで設定されています。
App_Startフォルダ → WebApiConfig.cs
こちらが本題ですが、上記ファイルで、”api/{controller}/{id}”のルーティングが設定されています。これは、ASP.NET Web APIのController(System.Web.Http.ApiControllerクラス)のルーティングです。
生成されたテンプレートには、このWeb APIのコントローラで、Controllersフォルダ配下にValuesController.csがあるのでこれをURLを指定して呼び出してみます。起動した状態で以下のように(※例です。ポート番号は各自違うと思います。)URLを指定します。
http://localhost:62205/values
そうすると、以下のようなJSONのレスポンスが返ってきました。これは、Controllersフォルダ配下のValuesController.csのGet()メソッドの処理です。
["value1","value2"]
以上を整理すると、今回のプロジェクトの構成と使い方は以下のように考えればいいでしょうか。
・ASP.NETのMVCとWeb APIのテンプレートが使える。
・ASP.NETのMVCとWeb APIのルーティングはそれぞれ別に設定されている。
・ASP.NETのMVCとWeb APIではコントローラは別クラスからの継承である。
・コントローラはとりあえず全てControllersフォルダ配下に実装していく。
・モデルはModelsフォルダに実装していく。
・Viewsフォルダは基本的には、ASP.NETのMVCのViewになる。
・JQueryは最初から組み込まれているので使える。
以上を踏まえて、ファイルを追加していきます。
モデルファイルの追加
Modelsフォルダの配下に今回のモデルを追加します。Modelsフォルダの右クリックから追加していきます。
ASP.NET Entity Data Modelを選択します。
これで確かに空のCode Firstモデルが生成されました。これに以下の回で作成したモデルを組み込みます。
ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築
多少クラス名が違いますが、以下のようになりました。生成されたコメントはそのままにしてあります。実際には命名規約やアノテーションを考慮してコードファーストのモデルを記述しますが、ここではとりあえずということで以下のようなクラスにしました。Idというプロパティは自動的に主キーになるので少なくとも主キーは管理出来ます。
namespace ASPNETWebApiTemperature.Models { using System; using System.Data.Entity; using System.Linq; using System.ComponentModel.DataAnnotations; public class Temperature : DbContext { // コンテキストは、アプリケーションの構成ファイル (App.config または Web.config) から 'Temperature' // 接続文字列を使用するように構成されています。既定では、この接続文字列は LocalDb インスタンス上 // の 'ASPNETWebApiTemperature.Models.Temperature' データベースを対象としています。 // // 別のデータベースとデータベース プロバイダーまたはそのいずれかを対象とする場合は、 // アプリケーション構成ファイルで 'Temperature' 接続文字列を変更してください。 public Temperature() : base("name=Temperature") { } // モデルに含めるエンティティ型ごとに DbSet を追加します。Code First モデルの構成および使用の // 詳細については、http://go.microsoft.com/fwlink/?LinkId=390109 を参照してください。 // public virtual DbSet<MyEntity> MyEntities { get; set; } public virtual DbSet<SensorDevice> SensorDevices { get; set; } public virtual DbSet<TemperatureData> TemperatureDatas { get; set; } } //public class MyEntity //{ // public int Id { get; set; } // public string Name { get; set; } //} /// <summary> /// センサーデバイス /// </summary> public class SensorDevice { public int Id { get; set; } [Required] public int DeviceId { get; set; } [Required] [MaxLength(20), MinLength(5)] public string DeviceName { get; set; } [Required] [MaxLength(20), MinLength(5)] public string OwnerName { get; set; } } /// <summary> /// 温度データ /// </summary> public class TemperatureData { public int Id { get; set; } [Required] public int DeviceId { get; set; } [Required] public double TemperatureValue { get; set; } [Required] public DateTime CreatedDateTime { get; set; } } }
コントローラの追加
動作確認は後にして次は、Web APIのコントローラを追加します。Controllerフォルダの右クリックから追加していきます。
ここでは自動生成を使ってみるということで、Entity Frameworkを使用したアクションがあるWeb API2 コントローラを選択します。
モデルとデータコンテキストのクラスを以下のように選択します。温度データ蓄積という処理をするためにこのコントローラを生成します。
これで、TemperatureDatasController.csが生成されました。以下の回で書いたようなコントローラの処理が自動で生成されました。
ASP.NET Web APIでデータ蓄積(その3)ASP.NET ApiControllerクラス
ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView
ここで実際のデータ蓄積処理となるPostのメソッドに温度データにサーバサイドで時刻を設定することにします。
// POST: api/TemperatureDatas [ResponseType(typeof(TemperatureData))] public IHttpActionResult PostTemperatureData(TemperatureData temperatureData) { if (!ModelState.IsValid) { return BadRequest(ModelState); } //現在時刻を設定する temperatureData.CreatedDateTime = DateTime.Now; db.TemperatureDatas.Add(temperatureData); db.SaveChanges(); return CreatedAtRoute("DefaultApi", new { id = temperatureData.Id }, temperatureData); }
以上で温度データをPostして追加出来るかというところですが、長くなるので続きは次回に書きます。
今回のシリーズの一覧です。
ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは
ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築
ASP.NET Web APIでデータ蓄積(その3)ASP.NET ApiControllerクラス
ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView
ASP.NET Web APIでデータ蓄積(その5)ASP.NET Web APIテンプレートからの構築
ASP.NET Web APIでデータ蓄積(その6)ASP.NET Web APIでの動作確認
ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積
その他関連サイト
Getting Started with ASP.NET Web API 2 (C#)
Using Web API 2 with Entity Framework 6
Entity Framework Code First の規約
Entity Framework Code First のデータ注釈
Entity Framework での新しいデータベース向けの Code First
Amazon関連商品