サービス部の定義としてインターフェースを作成。これはなんであろうと一緒。
Imports System.ServiceModelサービスに対しての実体を実装。これもなんであろうと一緒。
<ServiceContract()> _
Public Interface ISampleService
<OperationContract()> _
Function GetStatus() As Boolean End Interface
Imports System.ServiceModelIISでホストしてもいいんだけど今回はセルフホストさせた。
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
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 件のコメント:
コメントを投稿