WCFを利用したRESTサービスサンプル
WCFを利用した、RESTっぽいサービスのサンプルを作成します。VisualStudioのテンプレートから自動生成された構成をそのまま使用してサービスを作成する手順です。
検証に使用した環境のバージョンは以下の通りです。
・Windows7 32bit
・.NET Framework 4.5
・Visual Studio 2013 Professional
・.NET Framework 4.5
・Visual Studio 2013 Professional
・JSON.NETのJArrayを使って配列データを操作する
・JSON.NETのJTokenを使ってJSONの中身を一つずつ参照しながら全項目を取得する
・【WCF】どんな型の引数でも受け取れるメソッドを作成する
・【WCF】文字列で作ったJSONをサービスの戻り値として返す
・RESTなWCFサービスのクロスドメイン対応
・JSON.NETのJTokenを使ってJSONの中身を一つずつ参照しながら全項目を取得する
・【WCF】どんな型の引数でも受け取れるメソッドを作成する
・【WCF】文字列で作ったJSONをサービスの戻り値として返す
・RESTなWCFサービスのクロスドメイン対応
WCFサービスアプリケーションプロジェクトの作成
「新しいプロジェクト」から「WCFサービスアプリケーション」を選択し、任意のフォルダへ保存します。「WCFサービスライブラリ」でも可能ですが、今回はIISにホストすることを前提として必要な設定やファイルが一通り揃っている「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" %>
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>
<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」に変更します。動作確認
デバッグ実行で確認します。任意のブラウザを指定して、以下の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 件のコメント :
コメントを投稿