質問編集履歴

2

誤字の修正

2021/04/10 06:12

投稿

Mashimasa
Mashimasa

スコア51

test CHANGED
File without changes
test CHANGED
@@ -16,9 +16,9 @@
16
16
 
17
17
  ### 該当のソースコード
18
18
 
19
- 私が作成したサンプルではホスト画面(ServerWindow.xaml)のボタンを押したタイミングでクライアントのコールバックメソッドを実行するような動作をします。
19
+ 私が作成したサンプルではホスト画面(ServerWindow.xaml)のボタンを押したタイミングでクライアントのコールバックメソッドを実行しています。
20
-
21
- ・クライアント接続時にホストのInitializeメソッドを実行し、ホスト側でOperationContextを保持するようにしています。
20
+
21
+
22
22
 
23
23
  ・クライアント画面でボタンを押した時は、クライアントのコンソールに"FromClient"と出力されます。
24
24
 

1

前回と質問の趣旨が変わった為内容変更しました。

2021/04/10 06:12

投稿

Mashimasa
Mashimasa

スコア51

test CHANGED
@@ -1 +1 @@
1
- WCFでのN:Nの通信
1
+ WCFでホスト側からクライアントメソッドを実行する方法について
test CHANGED
@@ -1,25 +1,339 @@
1
- 在WCFでクライアントPC-サービス間で業務上の通信をるシステムがあります。
2
-
3
-
4
-
5
- クライアントは複数存在が可能ですが、ホストは1台です(N:1の通信)。
6
-
7
- 通信を始めるのは必ずクライアントで、クライアントの要求に対してサービスが通知を返すような仕組みです。
8
-
9
-
10
-
11
- これをホストを複数台(N:Nの通信)にして、通信を始めるをクライアントらにしたいとい要望出ています。
12
-
13
-
14
-
15
- クライアント側でエンドポイントを複数保持し、サービスの通信先が切り替えが可能なのは調べて分かりましたが
16
-
17
- 複数側からの通知を受ける方法が分かりませんでした。
18
-
19
- (ちなみにービ側は全て同じプログラムです。
20
-
21
- そもそもWCFでこのようなことは実現可能なのでょうか?
22
-
23
-
24
-
25
- 具体的には、複数のサービスが各クライアントに、ある条件に一致るクライアントPCが無いか、1台ずつ問い合わせをしたいです
1
+ ### 実現しこと
2
+
3
+ WCFでホスト側から任意のタイミングでクライアントのメソッドを実行したい
4
+
5
+
6
+
7
+ ### 発生している問題
8
+
9
+ クライアントのOperationContextをホスト側で保持することで、実現することはできたのですが
10
+
11
+ 果たして方法は安全疑問です。
12
+
13
+ またはもっと良い方法があれば教えて欲しいです。
14
+
15
+
16
+
17
+ ### 該当ースコード
18
+
19
+ ・私が作成したンプルではホト画面(ServerWindow.xaml)のボタンを押したタイミンでクイアントのコールバックメソッドを実行るような動作をします
20
+
21
+ ・クライアント接続時にホストのInitializeメソッドを実行し、ホスト側でOperationContextを保持するようています。
22
+
23
+ ・クライアント画面でボタンを押した時は、クライアントのコンソールに"FromClient"と出力されます。
24
+
25
+ ・ホスト画面でボタンを押した時は、クライアントのコンソール"FromServer"と出力されます。
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ ####ホスト側
34
+
35
+ ServerWindow.xaml.vb
36
+
37
+ ```VBnet
38
+
39
+ Imports System.ComponentModel
40
+
41
+ Imports System.ServiceModel
42
+
43
+
44
+
45
+ Class ServerWindow
46
+
47
+ Private Host As ServiceHost
48
+
49
+ Public Shared Context As OperationContext
50
+
51
+
52
+
53
+ Private Sub ServerWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
54
+
55
+ Host = New ServiceHost(GetType(MyService))
56
+
57
+ Host.Open()
58
+
59
+ End Sub
60
+
61
+
62
+
63
+ Private Sub MainWindow_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
64
+
65
+ Host.Close()
66
+
67
+ End Sub
68
+
69
+
70
+
71
+ Private Sub ServerButton_Click(sender As Object, e As RoutedEventArgs) Handles ServerButton.Click
72
+
73
+ Dim callback = Context.GetCallbackChannel(Of IMyCallback)
74
+
75
+ callback.SendData("FromServer")
76
+
77
+ End Sub
78
+
79
+
80
+
81
+ End Class
82
+
83
+ ```
84
+
85
+ IMyService.vb
86
+
87
+ ```VBnet
88
+
89
+ Imports System.ServiceModel
90
+
91
+ <ServiceContract(CallbackContract:=GetType(IMyCallback))>
92
+
93
+ Public Interface IMyService
94
+
95
+ <OperationContract(IsOneWay:=True)>
96
+
97
+ Sub Initialize()
98
+
99
+
100
+
101
+ <OperationContract(IsOneWay:=True)>
102
+
103
+ Sub TestMethod()
104
+
105
+
106
+
107
+ End Interface
108
+
109
+
110
+
111
+ Public Interface IMyCallback
112
+
113
+ <OperationContract(IsOneWay:=True)>
114
+
115
+ Sub SendData(name As String)
116
+
117
+
118
+
119
+ End Interface
120
+
121
+ ```
122
+
123
+ MyService.vb
124
+
125
+ ```VBnet
126
+
127
+ Imports System.ServiceModel
128
+
129
+ <ServiceContract(CallbackContract:=GetType(IMyCallback))>
130
+
131
+ Public Interface IMyService
132
+
133
+ <OperationContract(IsOneWay:=True)>
134
+
135
+ Sub Initialize()
136
+
137
+
138
+
139
+ <OperationContract(IsOneWay:=True)>
140
+
141
+ Sub TestMethod()
142
+
143
+
144
+
145
+ End Interface
146
+
147
+
148
+
149
+ Public Interface IMyCallback
150
+
151
+ <OperationContract(IsOneWay:=True)>
152
+
153
+ Sub SendData(name As String)
154
+
155
+
156
+
157
+ End Interface
158
+
159
+ ```
160
+
161
+
162
+
163
+ app.config
164
+
165
+ ```xml
166
+
167
+ <system.serviceModel>
168
+
169
+ <bindings>
170
+
171
+ <netTcpBinding>
172
+
173
+ <binding name="NetTcpBinding_IMyService">
174
+
175
+ <security mode="None"/>
176
+
177
+ <readerQuotas maxArrayLength="1048576"/>
178
+
179
+ </binding>
180
+
181
+ </netTcpBinding>
182
+
183
+ </bindings>
184
+
185
+ <behaviors>
186
+
187
+ <serviceBehaviors>
188
+
189
+ <behavior name="MyServiceBehavior">
190
+
191
+ <serviceMetadata/>
192
+
193
+ </behavior>
194
+
195
+ </serviceBehaviors>
196
+
197
+ </behaviors>
198
+
199
+ <services>
200
+
201
+ <service name="WCFServer.MyService" behaviorConfiguration="MyServiceBehavior">
202
+
203
+ <host>
204
+
205
+ <baseAddresses>
206
+
207
+ <add baseAddress="net.tcp://0.0.0.0:48501/WCFTest"/>
208
+
209
+ </baseAddresses>
210
+
211
+ </host>
212
+
213
+ <endpoint address="net.tcp://0.0.0.0:48501/WCFTest" binding="netTcpBinding" contract="WCFServer.IMyService" bindingConfiguration="NetTcpBinding_IMyService"/>
214
+
215
+ <endpoint address="net.tcp://0.0.0.0:48501/mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
216
+
217
+ </service>
218
+
219
+ </services>
220
+
221
+ </system.serviceModel>
222
+
223
+ ```
224
+
225
+
226
+
227
+ ####クライアント側
228
+
229
+ ClientWindow.xaml.vb
230
+
231
+ ```VBNET
232
+
233
+
234
+
235
+ Imports System.ComponentModel
236
+
237
+ Imports System.ServiceModel
238
+
239
+ Imports WCFClient.WCFTest
240
+
241
+
242
+
243
+ Class ClientWindow : Implements WCFTest.IMyServiceCallback
244
+
245
+
246
+
247
+ Private Client As WCFTest.MyServiceClient
248
+
249
+
250
+
251
+ Private Sub ClientWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
252
+
253
+ Dim context = New InstanceContext(Me)
254
+
255
+ client = New WCFTest.MyServiceClient(context)
256
+
257
+ client.Initialize()
258
+
259
+ End Sub
260
+
261
+
262
+
263
+ Private Sub ClientWindow_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
264
+
265
+ Client.Close()
266
+
267
+ End Sub
268
+
269
+
270
+
271
+ Private Sub ClientButton_Click(sender As Object, e As RoutedEventArgs) Handles ClientButton.Click
272
+
273
+ client.TestMethod()
274
+
275
+ End Sub
276
+
277
+
278
+
279
+ Public Sub SendData(name As String) Implements IMyServiceCallback.SendData
280
+
281
+ Console.WriteLine(name)
282
+
283
+ End Sub
284
+
285
+
286
+
287
+ End Class
288
+
289
+
290
+
291
+ ```
292
+
293
+
294
+
295
+ app.config
296
+
297
+ ```xml
298
+
299
+ <system.serviceModel>
300
+
301
+ <bindings>
302
+
303
+ <netTcpBinding>
304
+
305
+ <binding name="NetTcpBinding_IMyService">
306
+
307
+ <security mode="None">
308
+
309
+ <transport sslProtocols="None" />
310
+
311
+ </security>
312
+
313
+ </binding>
314
+
315
+ </netTcpBinding>
316
+
317
+ </bindings>
318
+
319
+ <client>
320
+
321
+ <endpoint address="net.tcp://localhost:48501/WCFTest" binding="netTcpBinding"
322
+
323
+ bindingConfiguration="NetTcpBinding_IMyService" contract="WCFTest.IMyService"
324
+
325
+ name="NetTcpBinding_IMyService" />
326
+
327
+ </client>
328
+
329
+ </system.serviceModel>
330
+
331
+ ```
332
+
333
+
334
+
335
+
336
+
337
+ ### 補足情報(FW/ツールのバージョンなど)
338
+
339
+ WPF VB.net (.net 4.7.2)