実現したいこと
WCFでホスト側から任意のタイミングでクライアントのメソッドを実行したい
発生している問題
クライアントのOperationContextをホスト側で保持することで、実現することはできたのですが
果たしてこの方法は安全かどうかが疑問です。
またはもっと良い方法があれば教えて欲しいです。
該当のソースコード
私が作成したサンプルではホスト画面(ServerWindow.xaml)のボタンを押したタイミングでクライアントのコールバックメソッドを実行しています。
・クライアント画面でボタンを押した時は、クライアントのコンソールに"FromClient"と出力されます。
・ホスト画面でボタンを押した時は、クライアントのコンソールに"FromServer"と出力されます。
####ホスト側
ServerWindow.xaml.vb
VBnet
1Imports System.ComponentModel 2Imports System.ServiceModel 3 4Class ServerWindow 5 Private Host As ServiceHost 6 Public Shared Context As OperationContext 7 8 Private Sub ServerWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 9 Host = New ServiceHost(GetType(MyService)) 10 Host.Open() 11 End Sub 12 13 Private Sub MainWindow_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing 14 Host.Close() 15 End Sub 16 17 Private Sub ServerButton_Click(sender As Object, e As RoutedEventArgs) Handles ServerButton.Click 18 Dim callback = Context.GetCallbackChannel(Of IMyCallback) 19 callback.SendData("FromServer") 20 End Sub 21 22End Class
IMyService.vb
VBnet
1Imports System.ServiceModel 2<ServiceContract(CallbackContract:=GetType(IMyCallback))> 3Public Interface IMyService 4 <OperationContract(IsOneWay:=True)> 5 Sub Initialize() 6 7 <OperationContract(IsOneWay:=True)> 8 Sub TestMethod() 9 10End Interface 11 12Public Interface IMyCallback 13 <OperationContract(IsOneWay:=True)> 14 Sub SendData(name As String) 15 16End Interface
MyService.vb
VBnet
1Imports System.ServiceModel 2<ServiceContract(CallbackContract:=GetType(IMyCallback))> 3Public Interface IMyService 4 <OperationContract(IsOneWay:=True)> 5 Sub Initialize() 6 7 <OperationContract(IsOneWay:=True)> 8 Sub TestMethod() 9 10End Interface 11 12Public Interface IMyCallback 13 <OperationContract(IsOneWay:=True)> 14 Sub SendData(name As String) 15 16End Interface
app.config
xml
1 <system.serviceModel> 2 <bindings> 3 <netTcpBinding> 4 <binding name="NetTcpBinding_IMyService"> 5 <security mode="None"/> 6 <readerQuotas maxArrayLength="1048576"/> 7 </binding> 8 </netTcpBinding> 9 </bindings> 10 <behaviors> 11 <serviceBehaviors> 12 <behavior name="MyServiceBehavior"> 13 <serviceMetadata/> 14 </behavior> 15 </serviceBehaviors> 16 </behaviors> 17 <services> 18 <service name="WCFServer.MyService" behaviorConfiguration="MyServiceBehavior"> 19 <host> 20 <baseAddresses> 21 <add baseAddress="net.tcp://0.0.0.0:48501/WCFTest"/> 22 </baseAddresses> 23 </host> 24 <endpoint address="net.tcp://0.0.0.0:48501/WCFTest" binding="netTcpBinding" contract="WCFServer.IMyService" bindingConfiguration="NetTcpBinding_IMyService"/> 25 <endpoint address="net.tcp://0.0.0.0:48501/mex" binding="mexTcpBinding" contract="IMetadataExchange"/> 26 </service> 27 </services> 28 </system.serviceModel>
####クライアント側
ClientWindow.xaml.vb
VBNET
1 2Imports System.ComponentModel 3Imports System.ServiceModel 4Imports WCFClient.WCFTest 5 6Class ClientWindow : Implements WCFTest.IMyServiceCallback 7 8 Private Client As WCFTest.MyServiceClient 9 10 Private Sub ClientWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 11 Dim context = New InstanceContext(Me) 12 client = New WCFTest.MyServiceClient(context) 13 client.Initialize() 14 End Sub 15 16 Private Sub ClientWindow_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing 17 Client.Close() 18 End Sub 19 20 Private Sub ClientButton_Click(sender As Object, e As RoutedEventArgs) Handles ClientButton.Click 21 client.TestMethod() 22 End Sub 23 24 Public Sub SendData(name As String) Implements IMyServiceCallback.SendData 25 Console.WriteLine(name) 26 End Sub 27 28End Class 29
app.config
xml
1<system.serviceModel> 2 <bindings> 3 <netTcpBinding> 4 <binding name="NetTcpBinding_IMyService"> 5 <security mode="None"> 6 <transport sslProtocols="None" /> 7 </security> 8 </binding> 9 </netTcpBinding> 10 </bindings> 11 <client> 12 <endpoint address="net.tcp://localhost:48501/WCFTest" binding="netTcpBinding" 13 bindingConfiguration="NetTcpBinding_IMyService" contract="WCFTest.IMyService" 14 name="NetTcpBinding_IMyService" /> 15 </client> 16 </system.serviceModel>
補足情報(FW/ツールのバージョンなど)
WPF VB.net (.net 4.7.2)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。