【VB.NET】WCF+REST+JSONでサービス作成


WCFを利用したRESTサービスサンプル

WCFを利用した、RESTっぽいサービスのサンプルを作成します。

VisualStudioのテンプレートから自動生成された構成をそのまま使用してサービスを作成する手順です。

検証に使用した環境のバージョンは以下の通りです。
・Windows7 32bit
・.NET Framework 4.5
・Visual Studio 2013 Professional




WCFサービスアプリケーションプロジェクトの作成

「新しいプロジェクト」から「WCFサービスアプリケーション」を選択し、任意のフォルダへ保存します。

「WCFサービスライブラリ」でも可能ですが、今回はIISにホストすることを前提として必要な設定やファイルが一通り揃っている「WCFサービスアプリケーション」を選択しました。

wcfサービスアプリケーション 新しいプロジェクト

ソリューション構成は以下のようになっています。
wcfサービスアプリケーション ソリューション構成


インターフェースの定義(IService1.vb)

はじめに、「IService1.vb」を開いて、自動生成されているコードを全て削除します。

自動生成コードを削除したら、代わりに以下のコードを追加します。
GETで呼び出されるメソッドは「WebGet」属性、POSTで呼び出されるメソッドは「WebInvoke」属性とします。
Imports System.Runtime.Serialization
Imports System.ServiceModel
<ServiceContract()>
Public Interface IService1

    ''GETメソッドで呼び出されるのはこちら
    <OperationContract()
     , WebGet(ResponseFormat:=WebMessageFormat.Json
             , UriTemplate:="/call/{data}")>
    Function GetMethod(ByVal data As String) As WcfResponse

    ''POSTメソッドで呼び出されるのはこちら
    <OperationContract()
     , WebInvoke(Method:="POST"
         , RequestFormat:=WebMessageFormat.Json
         , ResponseFormat:=WebMessageFormat.Json
         , UriTemplate:="/call")>
    Function PostMethod(ByVal req As WcfRequest) As WcfResponse

End Interface

<DataContract()>
Public Class WcfRequest
    <DataMember(Name:="Value")>
    Public Property Value() As String
End Class

<DataContract()>
Public Class WcfResponse

    <DataMember(Name:="Param")>
    Public Property Param() As String

    <DataMember(Name:="Message")>
    Public Property Message() As String
End Class


インターフェースの実装を作成(Service1.svc.vb)

「Service1.svc」を右クリックし、「コードの表示」を選択して、「Service1.svc.vb」を開きます。

開いたら、自動生成されているコードを全て削除して以下のコードを追加します。
Public Class Service1
    Implements IService1

    Public Function GetMethod(ByVal data As String) As WcfResponse  Implements IService1.GetMethod
        Return New WcfResponse() With {.Param = data, .Message = "GetMethod"}
    End Function

    Public Function PostMethod(ByVal req As WcfRequest) As WcfResponse Implements IService1.PostMethod
        Return New WcfResponse() With {.Param = req.Value, .Message = "PostMethod"}
    End Function
End Class


マークアップの修正(Service1.svc)

「Service1.svc」を右クリックし、「マークアップの表示」を選択します。

「Factory="System.ServiceModel.Activation.WebServiceHostFactory" 」を追加します。

「.svc」ファイルを使用してホスティングすると、規定では「ServiceHostFactory」クラスが使用されますが、RESTサービスとするためには「WebServiceHostFactory」クラスを指定します。
RESTサービスに必要な構成はこの「WebServiceHostFactory」クラスがやってくれるらしいです。

<%@ ServiceHost Language="VB"
    Debug="true"
    Service="WcfService1.Service1"
    CodeBehind="Service1.svc.vb"
    Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>


Web.configの修正(Web.config)

Factoryの指定でWeb.configファイルの「serviceModel」要素は不要となるので、削除します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <!--<system.serviceModel>-->
    <!--<behaviors>-->
      <!--<serviceBehaviors>-->
        <!--<behavior>-->
          <!-- メタデータ情報の開示を避けるには、展開する前に下の値を false に設定します -->
          <!--<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>-->
          <!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、下の値を true に設定します。例外情報の開示を避けるには、展開する前に false に設定します -->
          <!--<serviceDebug includeExceptionDetailInFaults="false"/>-->
        <!--</behavior>-->
      <!--</serviceBehaviors>-->
    <!--</behaviors>-->
    <!--<protocolMapping>-->
        <!--<add binding="basicHttpsBinding" scheme="https" />-->
    <!--</protocolMapping>-->   
    <!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />-->
  <!--</system.serviceModel>-->
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        デバッグ中に Web アプリケーションのルートを直接参照するには、下の値を true に設定します。
        Web アプリケーション フォルダーの情報開示を避けるには、展開する前に false に設定します。
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>


ポート設定

プロジェクトのプロパティから「Web」を選択し、「サーバー」の「プロジェクトのURL」に書かれているポート番号を「8080」に変更します。
wcfサービスアプリケーション プロジェクトプロパティ


動作確認

デバッグ実行で確認します。任意のブラウザを指定して、以下のURLへアクセスするとJSONファイルのダウンロードが開始されます。
http://localhost:8080/Service1.svc/call/test


参考:SOAPとRESTの比較

SOAP

・SOAPはプロトコル。
・下位プロトコルから独立している。(HTTP、FTP、SMTPなどに依存しない。)
・仕様が細かく決まっている。(WS-*)
・メッセージ形式はXML。

REST

・RESTは考え方(プロトコルではない)
・HTTPプロトコルの仕様上にのみ成り立つ
・原則はあるが細かい仕様の指定はない
・メッセージ形式は何でも良い

RESTの原則

・ユニークなアドレス
コンテンツ(リソース)を一意なURLで表現する
・ステートレス
通信が独立した要求(request)と応答(response)から成り立つこと。それぞれの要求がそれ以前の要求とは無関係として扱うこと。
・情報と状態遷移の接続性
やり取りする情報の内部に別の関連するリソースへのリンクを含める。
・インターフェースの統一
リソース(URL)に対して「GET」「POST」「PUT」「DELETE」で操作する。

以上

<スポンサーリンク>


0 件のコメント :

コメントを投稿