WCF を利用した RESTful Web サービス の 作成

0 件のコメント

WCF サービス を利用して、RESTful Web サービス を作成します。 ただ WCF サービス プロジェクト を追加しただけだと Web サービス としてはうまく動作しなかったので、 キチンと動作するまでに必要な環境整備、実装を記載します。

サンプルコード の ダウンロード

環境構築

Visual Studio、.NET Framework 3.0 - 4.5 までが インストール済み の環境を仮定します。 その上で、以下の設定を行います。

  1. [コントロールパネル] を開きます。
  2. [プログラムのアンインストール] を選択します。
  3. [Windows の機能の有効化または無効化] を選択します。
  4. 次の項目を選択(有効化)します。
     .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 サービス の 実装

  1. ソリューション に "WCF サービス アプリケーション" を追加します。
    自動で追加される IService1.csService1.cs は、不要なコードを削除してそのまま使います。
  2. System.ServiceModel.Activation への参照を追加します。
  3. Global.asax を追加します。
  4. Global.asaxApplication_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)));
    }
    
  5. Web.configaspNetCompatibilityEnabled="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>
    
  6. IService1.csGreeting インターフェース を定義します。
    この サンプルコード の場合、次のアドレスでアクセスできます。
    http://[SERVER_NAME]/[SERVICE_NAME]/Greeting/{name}
    SERVICE_NAMEGlobal.asax で Urlルートテーブル に登録したサービス名(今回だと SampleService)になります。
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "Greeting/{name}")]
        string Greeting(string name);
    }
    
  7. Service1.csGreeting インターフェース を実装します。
    クラス に対して 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 + ".";
        }
    }
    
  8. 作業は以上です。実行して正常動作するかどうか テスト します。

動作確認

プロジェクトを実行して、任意のブラウザで以下のアドレスへアクセスします。 正常に動作していれば、json のダウンロードができるはずです。

http://localhost:[PORT_NO]/SampleService/Greeting/ShinobuAkiyama

正常にサービスが動作しているかどうかは以下のアドレスで確認できます。

http://localhost:[PORT_NO]/Service1.svc

今回、以下のサイトを参考にしました。