WCF サービス を利用して、RESTful Web サービス を作成します。 ただ WCF サービス プロジェクト を追加しただけだと Web サービス としてはうまく動作しなかったので、 キチンと動作するまでに必要な環境整備、実装を記載します。
サンプルコード の ダウンロード 。
環境構築
Visual Studio、.NET Framework 3.0 - 4.5 までが インストール済み の環境を仮定します。 その上で、以下の設定を行います。
- [コントロールパネル] を開きます。
- [プログラムのアンインストール] を選択します。
- [Windows の機能の有効化または無効化] を選択します。
- 次の項目を選択(有効化)します。
.NET Framework 3.5 (.NET 2.0 および 3.0 を含む) Windows Communication Foundation HTTP アクティブ化 Windows Communication Foundation 非 HTTP アクティブ化 .NET Framework 4.5 Advanced Services ASP.NET 4.5 WCF サービス HTTP アクティブ化 TCP アクティブ化 TCP ポート共有 メッセージ キュー (MSMQ) アクティブ化 名前付きパイプのアクティブ化
RESTful WCF サービス の 実装
- ソリューション に "WCF サービス アプリケーション" を追加します。
自動で追加される IService1.cs、 Service1.cs は、不要なコードを削除してそのまま使います。
System.ServiceModel.Activation
への参照を追加します。
- Global.asax を追加します。
- Global.asax の
Application_Start
に サービス への マッピング を記述します。
protected void Application_Start(object sender, EventArgs e) { // Url ルートテーブル コレクション を取得 var routes = System.Web.Routing.RouteTable.Routes; // サービス実態 (Service1 クラス) への マッピング を登録 routes.Add(new System.ServiceModel.Activation.ServiceRoute( "SampleService", new System.ServiceModel.Activation.WebServiceHostFactory(), typeof(Service1))); }
- Web.config に
aspNetCompatibilityEnabled="true"
を追記します。
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <!-- メタデータ情報の開示を避けるには、展開する前に、下の値を false に設定し、上のメタデータのエンドポイントを削除します --> <serviceMetadata httpGetEnabled="true"/> <!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、下の値を true に設定します。例外情報の開示を避けるには、展開する前に false に設定します --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
- IService1.cs に
Greeting
インターフェース を定義します。
この サンプルコード の場合、次のアドレスでアクセスできます。
http://[SERVER_NAME]/[SERVICE_NAME]/Greeting/{name}SERVICE_NAME は Global.asax で Urlルートテーブル に登録したサービス名(今回だと SampleService)になります。[ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "Greeting/{name}")] string Greeting(string name); }
- Service1.cs に
Greeting
インターフェース を実装します。
クラス に対してActivation.AspNetCompatibilityRequirements 属性
をAspNetCompatibilityRequirementsMode.Allowed
で設定します。[System.ServiceModel.Activation.AspNetCompatibilityRequirements( RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)] public class Service1 : IService1 { public string Greeting(string name) { return "Hello " + name + "."; } }
- 作業は以上です。実行して正常動作するかどうか テスト します。
動作確認
プロジェクトを実行して、任意のブラウザで以下のアドレスへアクセスします。 正常に動作していれば、json のダウンロードができるはずです。
http://localhost:[PORT_NO]/SampleService/Greeting/ShinobuAkiyama
正常にサービスが動作しているかどうかは以下のアドレスで確認できます。
http://localhost:[PORT_NO]/Service1.svc
今回、以下のサイトを参考にしました。
- かずきのBlog@hatena - RESTでJSONなサービスをWCFで作ったり使ったりする
- MSDN マガジン - WCF を使用した RESTful サービスの概要
- MSDN - RouteTable メンバ
- MSDN - ServiceRoute クラス
- MSDN - WebServiceHostFactory クラス
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!