日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

Java, Clojure くらいしか知らない自分が ASP.NET 上で動く Web サービスをイチから作る

はじめに

前回の記事 で NuGet の使い方から始まったのはこいつを使いたかったから。

.NET上で動き、IIS 上でホスティングする Web サービスを作る必要性が出てきて、 現状.NET 界隈を調べた感じ ASP.NET Web API.aspx) 使って作るのが 一番良さそうに思った。

Visual Studio 2015 だとプロジェクトテンプレートがあり、最初それを参考にすればいいかなと思ってたのだが、 見てるとどうも結構 ASP.NET Web API とは直接関係ないものも結構入っていて C#/ASP.NET 未経験の自分は混乱した。

時間はかかるかもしれないが、こりゃまずイチから作った方が良さそうな気がしたので 改めてその方向でググると日本語でバッチリの記事が見つかった。

読んでみて雰囲気は分かるが、細かい部分でなぜそうなるのかが分からない部分がかなり多くつまづいた。 2,3程度ならその場でちょっと調べて済ませようと思ったが、 かなり調べる事になったので、作業の流れには添いつつも自分の知識が不足してる面を補足的にメモする事にした。

なお、上記記事は動作確認までしか試してない。 これは単に自分がまず知っておくべきなのはそこまでかなと思っただけ。

実行環境

手順概要

ASP.NET Web API を使った最低限のコードを動作させるには以下の手順を踏む必要がある。

# 手順 元記事該当セクション
1 ASP.NET 空 Web アプリプロジェクトを作る プロジェクトの作成
2 外部ライブラリの依存性の解決 必要な参照の追加
3 WebAPI 初期設定を行うクラスファイルを用意する Global.asaxの追加
4 Global.asax に初期設定コードを記述する Global.asaxの追加
5 実際の API となるコントローラクラスの追加 動作確認
6 動作確認 動作確認

自分の理解のため、やや冗長ではあるが元記事より項目を細分化した。 この記事では以降、手順の方でタイトルを書いていく。

ASP.NET 空 Web アプリプロジェクトを作る

Visual Studio 2015 のメニューから ファイル -> 新規作成 -> プロジェクト で ASP.NET Web アプリケーション -> Empty で 空のプロジェクトが作成される。 この時点でそこそこいくつかフォルダやファイルが出来ているが、今回は必要そうなもの以外は無視して 何もしない事にする。

外部ライブラリの依存性の解決

他言語環境でのパッケージマネージャでは依存性の解決とか呼んだりするアレ。

ツール -> NuGet パッケージマネージャー -> ソリューションの NuGet パッケージの管理 から出る画面左上の検索ボックスにMicrosoft.AspNet.WebApiを検索すれば出てくる完全一致のもの (多分検索結果の一番上に出ると思う) にチェックしてインストールすれば良い。

前回の記事にあったように、一度ダウンロードしたものはキャッシュとして指定場所に保存されている。

WebAPI 初期設定を行うクラスファイルを用意する

ASP.NET WebAPI でこの役割を担うのがグローバルアプリケーションクラスであり、 ファイル名はGlobal.asaxと決まっている模様。

Global.asax 自体は ASP.NET WebAPI 専用と言うわけでもなく、ASP.NET 登場当初からあった ASP.NET Web アプリのグローバル設定を持たせるためのファイルらしい。 (@ITの参考記事)

Visual Studio から追加した場合、実際に WebAPI 初期化処理を書く場所となるメソッドである Application_Start だけでなく 他にも色々と追加されるが、今回は不要なので Application_Start メソッドのみ残し他は削除した。

Application_Start が呼び出されるタイミングなどは以下の記事が参考になった。 - ASP.NETのライフサイクルの仕組み - このサイトによると ASP.NET Web アプリが呼び出される最初の一回だけらしい。MSDN でもどっかで見たような気がするけどブックマークしとくの忘れた。

Global.asax に初期設定コードを記述する

元記事では必要ファイルの追加とコードの内容だけ書いてかなり短く済ませており、C#/ASP.NET 経験者には十分なのかもしれないが、 自分はかなり分からない部分がありここで色々調べた。

疑問1: App_Start フォルダ作成は必須なのか?

Visual Studio デフォルトで用意されている ASP.NET Web API プロジェクトテンプレート作成する方法では確かに作られているが stackoverflow での同様の質問と回答 を見る限りでは、別に ASP.NET アプリを動作させるための必須フォルダと言うわけでもなさそう。 回答に書かれているリンク先ブログにもっと詳しく書かれてそうな記事があったが、 自分はひとまず必須かそうでないかだけを知りたかっただけなので今回は読んでいない。

疑問2: WebApiConfig クラスとその Register メソッドは必須なのか?

英語だが、MS公式サイトにある一文が最も分かり易かった。

In an ASP.NET application, configure Web API by calling GlobalConfiguration.Configure in the Application_Start method. (引用元)

疑問に対する答えとしては別に必須ではない、となる。

元記事でのRegisterは結局は初期設定を持つ GlobalConfiguration.Configurationプロパティ.aspx) を引数に渡して書き換えているだけで、名前は極端な話 foo.bar でも動作的には問題なさそう。 *1

対して MS 公式にある方はラムダ式を使ってもっと直接的に書き換えているので、自分の練習も兼ねて今回はラムダ式を使った方法で書き直した。

動作確認

元記事にあるように Visual Studio で Web API Controller クラスを追加すると、 動作するための最低限のテンプレートも入っていて、動作確認だけであれば全くいじる必要はない。

Visual Studio のプロジェクトを実行すると localhost でセルフホスティングする Web サーバが立ち上がってブラウザがそこの URL を開く模様。 ただ、アクセスするURL http://localhost:<port>/ は HTTP 403 forbidden エラーが出る。 これで動作確認失敗と言うわけではなく、登録した ValuesController クラスにアクセスする URL ではないと言うだけ。

Fiddlerを使って http://locahost:<port>/api/values の URL に対して HTTP GET リクエストを出すと、結果がちゃんと返ってきた。 面白いのは Chrome に同じ URL を入れると XML で返ってきて、 Fiddler で Content-Type: application/json ヘッダを付ける (元の記事のやり方)で返すと JSON 形式で返ってきている所。

ASP.NET WebAPI は色んなメッセージング形式に対応しているとだけ聞いていて今回調べていたが ようやく少し実感できたかもしれない。

ちなみに元の記事で使っていた Fiddler は自分も興味があったから使ってみただけで 今回の結果を見たいだけであればブラウザアクセスするだけで間に合う。

調べた時に気にはなったが試してないもの

*1:Java のようにクラス名は大文字からという規則はあるかもしれないがそれは言語仕様レベルの話でまた別