1. 基本的な方法
1.1. ホスト
以下の<0> ~ <4>の処理を記述する。
using System.ServiceModel;
namespace HelloWCF
{
// <0> ServiceContractをインターフェースとして定義
[SercieContract(namespace = "http://My.WCF.Samples")]
public interface IService1
{
[OperationContract]
string getMessage(string inputMessage);
}
public class Service1 : IService1
{
public string getMessage(string inputMessage)
{
...
}
}
static void Main(string[] args)
{
Uri baseAddr = new Uri("http://host:port/ServcieName");
// <1> ベースアドレスからServiceHostを生成
using (ServiceHost svcHost = new ServiceHost(typeof(Service1), baseAddr))
{
// <2> ServiceHostインスタンスにエンドポイントを追加
svcHost.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "test");
// <3> ServiceHostオープン
svcHost.Open();
...
// <4> ServiceHostクローズ
svcHost.Close();
}
}
}
1.2. クライアント
以下の<0> ~ <3>の処理を記述する。
using System.ServiceModel
// <0> サービスコントラクト(インターフェース)の宣言
サービスコントラクト宣言は省略。
method()
{
// <1> エンドポイントアドレス(サービスの絶対アドレス:System.ServiceModel.EndpointAddress)を生成
EndpointAddress epAddr = new EndpointAddress ("http://host:port/ServcieName/test");
// <2> ChannelFactoryからプロキシを生成
IService1 proxy = ChannelFactory<IService1>.CreateChannel(new BasicHttpBinding(), epAddr);
try
{
// <3> プロキシ経由でメソッドを実行
var return = proxy.getMessage("abc");
...
}
catch (CommunicationException ex)
{
...
}
}
2. [WCFサービス ライブラリ]テンプレートを利用する方法
2.1. 概要
以下の構成でソリューションを作成。
- VsSolution
- Libraryプロジェクト (output:dll)
"WCFサービス ライブラリ"テンプレートの利用- IService1.cs : ServiceContract宣言(名前空間:HelloWCF2)
- Service1.cs : ServiceContract実装
- Hostプロジェクト (output:exe)
Libraryプロジェクトを"参照の追加"- App.config (アプリケーション構成ファイル)
- Program.cs
- Clientプロジェクト (output:exe)
Hostプロジェクトの"サービス参照の追加" - Service References\ServiceReferene1\Reference.cs(自動生成されたサービス参照)
- App.config(自動生成されたアプリケーション構成ファイル)
- Form1.cs(Windowsアプリケーションテンプレートによる生成)
2.2. Hostプロジェクト
Libraryプロジェクトの参照を追加し以下の作業を行う。
- "参照の追加"を設定
- App.configの編集
- WCFサービスのコントラクト情報開示設定
- WCFサービス公開設定
- ホスト(Program.Main)の実装
2.2.1. App.configの編集
以下の(0) ~ (1)の処理を記述する。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<!--
(0) [[WCF]]サービスのコントラクト情報公開の為のサービスのビヘイビア変更
既定のビヘイビアではメタデータは公開されない為、[[HTTP]]のGET要求で
サービスのメタデータの取得が可能となる。
-->
<behaviors>
<behavior name="svcBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</behaviors>
<!-- (0) -->
<!--
(1) WCFサービスの定義。このサービスでは(0)で定義されたビヘイビアが
適用され、そのメタデータを公開する。またエンドポイント要素と
ホスト要素を定義。
エンドポイント要素"endpoint"として以下の情報を設定する。
1. コントラクト
2. バインディング
3. 相対アドレス
ホスト要素"host"ではベースアドレスを設定する。
-->
<services>
<service behaviorConfiguration="svcBehavior" name="HelloWCF2.Service1">
<endpoint address="HelloWCF" binding="basicHttpBinding"
name="basicHttp" contract="HelloWCF2.IService1" />
<host>
<baseAddress>
<add baseAddress="http://localhost:8000/WCFSampleService" />
</baseAddress>
</host>
</service>
</services>
<!-- (1) -->
</system.serviceModel>
</configuration>
2.2.2. ホスト(Program.Main)の実装
App.configにてベースアドレス定義やエンドポイント追加を記述した為、プログラムでハードコーディングは不要となる。
using System.ServiceModel;
namespace Host
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost svcHost = new ServiceHost(typeof(HelloWCF2.Service1)))
{
svcHost.Open();
...
svcHost.Close();
}
}
}
}
2.3. Clientプロジェクト
以下の作業を行う。
- WCFサービスのメタデータ公開確認
- "サービス参照の追加"を設定
- クライアント(From1)の実装
2.3.1. WCFサービスのメタデータ公開確認
Hostプロジェクトのexeを実行し以下のURLに正しくアクセスできることを確認する。
2.3.2. "サービス参照の追加"を設定
"参照設定"から"サービス参照の追加"を実行する。"サービス参照の追加"ダイアログのアドレスは"検索"ボタンで入力するか、直接ベースアドレスを入力する。
この操作により以下のオブジェクトが自動生成される。
- "Service References"以下の"ServiceReference1"名前空間
- IService1が利用できるクライアント"Service1Client"
- App.config
2.3.3. クライアント(From1)の実装
以下の<0> ~ <3>の処理を記述する。
// <0> "サービス参照の追加"で生成された名前空間も引用する。
using System.ServiceModel;
using Client.ServiceReference1;
namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// <1> クライアント生成
Service1Client client = new Service1Client();
// <2> WCFサービス呼び出し
try
{
string outputMessage = client.getMessage(".NET WCF");
...
}
catch (CommunicationException commEx)
{
MessageBox.Show("サービス呼び出し失敗:" + commEx.Message);
}
// <3> クライアントクローズ
client.Close();
}
}
}
3. RESTfulサービス(GET)の実装
3.1. 概要
以下の構成でソリューションを作成。
- [WCFサービスアプリケーション]テンプレートでプロジェクトを作成する。
- データコントラクトを定義する。(インターフェース)
- 属性を定義した具象化クラスを実装する。
- *.svcファイルのServiceHostタグ属性FactoryでWebServiceHostFactoryを指定する。
IOrderService.cs
using System.ServiceModel;
namespace WCFServiceWebRole1
{
[ServiceContract]
public interface IOrderService
{
[OperationContract]
OrderItem GetOne(string id);
}
[DataContract(Namespace = "", Name = "OrderItem")]
public class OrderItem
{
[DataMember]
public int Id;
[DataMember]
public string Name;
}
}
OrderService.svc.cs
using System.ServiceModel.Web;
namespace WCFServiceWebRole1
{
public class OrderService : IOrderService
{
// WebMessageFormat.Xml : POX(プレーンなXML形式)
[WebGet(UriTemplate = "orders/{id}", ResponseFormat = WebMessageFormat.Xml)]
public OrderItem GetOne(string id)
{
return new OrderItem
{
Id = int.Parse(id),
Name = "テスト"
};
}
}
}
OrderService.svc
<%@ ServiceHost Language="C#" Debug="true"
Service="WCFServiceWebRole1.OrderService"
CodeBehind="OrderService.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>
4. RESTfulサービス(GET, POST)の実装
最終更新:2011年07月04日 16:57