2010年9月7日火曜日

WCF 名前付きパイプでの通信

非常に今さらながら感があるけれど、ようやく最近まっとうにさわり始めたのでメモ。
サービス部の定義としてインターフェースを作成。これはなんであろうと一緒。
Imports System.ServiceModel
<ServiceContract()> _
Public Interface ISampleService
    <OperationContract()> _
    Function GetStatus() As Boolean End Interface
サービスに対しての実体を実装。これもなんであろうと一緒。
Imports System.ServiceModel
Public Class SampleService
    Implements ISampleService
    Public Function GetStatus() As Boolean Implements ISampleService.GetStatus
        Console.WriteLine("Is Called Method [GetStatus]")
        Return True
    End Function
End Class
IISでホストしてもいいんだけど今回はセルフホストさせた。
Private Const PipeNamespace As String = "http://schemas.sample.jp/SampleServices"
Private Const NamedPipeAddress As String = "net.pipe://localhost/SampleService.svc"
Sub Main()
    Dim localServiceAddress As Uri() = {New Uri(NamedPipeAddress)}
    Dim svType As Type = GetType(TaskNotifyService)
    Using taskNotifySv As New ServiceHost(svType, localServiceAddress)
        Dim namedPipe As Binding = New NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
        namedPipe.Namespace = PipeNamespace
        Dim taskNotifyMetadata As New ServiceMetadataBehavior
        taskNotifySv.AddServiceEndpoint(GetType(ITaskNotifyService), namedPipe, String.Empty)
        taskNotifySv.Description.Behaviors.Add(taskNotifyMetadata)
        taskNotifySv.Open()
        Console.ReadLine()
        taskNotifySv.Close()
    End Using End Sub
これで net.pipe://localhost/SampleService.svc というアドレスにて名前付きパイプで通信が可能になるので、あとはクライアント側の実装。
Sub Main()
    Dim namedPipe As Binding = New NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
    Dim localAddress As New EndpointAddress("net.pipe://localhost/SampleService.svc")
    Using cf As New ChannelFactory(Of SampleLibrary.ISampleService)(namedPipe, localAddress)
        cf.Open()
        Dim cProxy As SampleLibrary.ISampleService = cf.CreateChannel
        Console.WriteLine("Called Method : " + cProxy.GetStatus.ToString)
        Console.ReadLine()
        cf.Close()
    End Using End Sub
サービスとインターフェースを実装しているライブラリを参照する必要があるけど、これぐらい手軽にできるのは WCF って便利だねぇ。

0 件のコメント:

コメントを投稿