🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WCF

WCFは、.NET Frameworkの提供する機能の一つ。サービス指向アプリケーション構築のためのフレームワークです。ネットワークを通して、異なるコンピュータ上で動くソフトウェア間の通信が可能になります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1276閲覧

WCFでホスト側からクライアントのメソッドを実行する方法について

Mashimasa

総合スコア51

WCF

WCFは、.NET Frameworkの提供する機能の一つ。サービス指向アプリケーション構築のためのフレームワークです。ネットワークを通して、異なるコンピュータ上で動くソフトウェア間の通信が可能になります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2021/03/16 23:43

編集2021/04/10 06:12

実現したいこと

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

実際にテストしてみて問題なさそうだったので解決とします。

投稿2022/03/08 08:15

Mashimasa

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問