WCF的执行过程

既然是实现互通信。那么肯定会有概念意义上的服务端Server  和概念意义上的客户端 Client,在这里,我所说明的都是概念意义上的,单独强调此,是因为,基于WCF的通信没有物理上的划分,但是概念上肯定有边界。原因:

1  WCF可以host(承载)在 WAS 基于Web的方式激活,也可以承载在Winform程序, Windows服务(本质就是无窗口的窗体程序),WPF程序 , 控制台程序(自承载),传统意义上 的CS架构。物理界限分明,服务端就是服务端,客户端调用发送请求到服务端。WCF这种不强制承载环境,多通信协议的三炮,彻底打乱了保守的三观。

 

以下是一个控制台承载的服务............
class Program
{
public static void Main()
{
ServiceHost host = new ServiceHost(typeof(MyCalculator));
host.Open();

//Can do blocking calls:
Console.WriteLine("Press ENTER to shut down service.");
Console.ReadLine();

host.Close();
}
}

 

配置文件:

无语了  ,太长了,一会儿在下面自己下载去.............

(下载地址:http://pan.baidu.com/s/1ntn3erB)

可见 ,这厮没有物理意义上的界限,同样,你也可以讲服务承载在你的客户端程序Winform中,当程序启动的时候,启动服务,然后就可以在程序间进行服务数据的传播。

好,说了一大堆废话,我们看看,这东西的执行过程吧。计算机世界中的东西都是按照流程走的,即使多线程并发 多进程,在CPU的世界永远都要排队执行,只不过丫执行太快,给人的幻觉是同时进行。。。。。。。

(看下面的时候:大家必须着重理解  通道通信,拦截分发,终结点的概念)

资料:http://www.cnblogs.com/millen/archive/2009/06/19/1506589.html

http://kb.cnblogs.com/page/109570/

WCF体系架构是基于一种拦截机制来实现的,负责传递和拦截消息的组件为通道,在客户端发出对服务端服务的调用时,首先会通过一个服务代理对象,将调用方提供的对象序列化到消息中,然后该消息则通过通道进行传递。通道不只是包括一个,而是多个通道对消息进行处理,包括传输、消息编码、管理会话、传播事务等,但最底层的通道总是传输通道。这些通道的构成形成了一个通道堆栈。由于对象已经被序列化,因而此时通道传递的消息可以跨进程或机器进行传递,利用传输通道传递到服务端。服务端的构成与客户端基本相似,仍然是通过通道栈中最底层的传输通道接收消息,然后解析消息编码,并一层层地往上传输。在服务端的通道栈之上,则是一个分发器(Dispatcher,或者说是调度器),它会首先对消息进行检查,然后选择一个客户端要调用的操作。在这个过程中,消息会被反序列化。

 

以下是执行过程的代码:

 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
 
namespace  wcfflow
{
    
using  System;
    
using  System.ServiceModel;
    
using  System.ServiceModel.Dispatcher;
    
using  System.Reflection;
    
using  System.ServiceModel.Channels;
    
using  System.Threading;
    
using  System.Globalization;
    
using  System.Text;
    
using  System.ServiceModel.Description;
    
using  System.Linq;
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property)]
    
public   class  CommentAttribute : Attribute
    {
        
public   string  Message { get; set; }
        
public  CommentAttribute( string  message)
        {
            
this .Message = message;
        }
    }

    
class  MyDispatchMessageInspector : IDispatchMessageInspector
    {
        
public  MyDispatchMessageInspector()
        {
        }
        [Comment(
"在已接收入站消息后将消息调度到应发送到的操作之前调用" )]
        
public   object  AfterReceiveRequest( ref  Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   null ;
        }
        [Comment(
"在操作已返回后发送回复消息之前调用" )]
        
public   void  BeforeSendReply( ref  Message reply,  object  correlationState)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
    }
    
class  MyDispatchMessageFormatter : IDispatchMessageFormatter
    {
        IDispatchMessageFormatter inner;
        
public  MyDispatchMessageFormatter(IDispatchMessageFormatter inner)
        {
            
this .inner = inner;
        }
        [Comment(
"将消息反序列化为参数数组" )]
        
public   void  DeserializeRequest(Message message,  object [] parameters)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
this .inner.DeserializeRequest(message, parameters);
        }
        [Comment(
"从指定的消息版本、参数数组和返回值序列化答复消息" )]
        
public  Message SerializeReply(MessageVersion messageVersion,  object [] parameters,  object  result)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.SerializeReply(messageVersion, parameters, result);
        }
    }
    
class  MyClientMessageInspector : IClientMessageInspector
    {
        
public  MyClientMessageInspector()
        {
        }
        [Comment(
"在收到回复消息之后将它传递回客户端应用程序之前,启用消息的检查或修改" )]
        
public   void  AfterReceiveReply( ref  Message reply,  object  correlationState)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
        [Comment(
"在将请求消息发送到服务之前,启用消息的检查或修改" )]
        
public   object  BeforeSendRequest( ref  Message request, IClientChannel channel)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   null ;
        }
    }
    
class  MyClientMessageFormatter : IClientMessageFormatter
    {
        IClientMessageFormatter inner;
        
public  MyClientMessageFormatter(IClientMessageFormatter inner)
        {
            
this .inner = inner;
        }
        [Comment(
"将消息转换为将传回给调用操作的返回值和 out 参数" )]
        
public   object  DeserializeReply(Message message,  object [] parameters)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.DeserializeReply(message, parameters);
        }
        [Comment(
"将 Object 数组转换为出站 Message" )]
        
public  Message SerializeRequest(MessageVersion messageVersion,  object [] parameters)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.SerializeRequest(messageVersion, parameters);
        }
    }
    
class  MyDispatchOperationSelector : IDispatchOperationSelector
    {
        [Comment(
"将本地操作与传入的方法相关联" )]
        
public   string  SelectOperation( ref  Message message)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
string  action = message.Headers.Action;
            
string  method = action.Substring(action.LastIndexOf( '/' ) +  1 );
            
return  method;
        }
    }
    
class  MyParameterInspector : IParameterInspector
    {
        ConsoleColor consoleColor;
        
bool  isServer;
        
public  MyParameterInspector( bool  isServer)
        {
            
this .isServer = isServer;
            
this .consoleColor = isServer ? ConsoleColor.Cyan : ConsoleColor.Yellow;
        }
        [Comment(
"在客户端调用返回之后、服务响应发送之前调用" )]
        
public   void  AfterCall( string  operationName,  object [] outputs,  object  returnValue,  object  correlationState)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), 
this .consoleColor,  "{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
        [Comment(
"在发送客户端调用之前、服务响应返回之后调用" )]
        
public   object  BeforeCall( string  operationName,  object [] inputs)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), 
this .consoleColor,  "{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   null ;
        }
    }
    
class  MyCallContextInitializer : ICallContextInitializer
    {
        [Comment(
"实现它来参与清理调用该操作的线程" )]
        
public   void  AfterInvoke( object  correlationState)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
        [Comment(
"实现它来参与初始化操作线程" )]
        
public   object  BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   null ;
        }
    }
    
class  MyOperationInvoker : IOperationInvoker
    {
        IOperationInvoker inner;
        
public  MyOperationInvoker(IOperationInvoker inner)
        {
            
this .inner = inner;
        }
        [Comment(
"返回参数对象的 System.Array" )]
        
public   object [] AllocateInputs()
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.AllocateInputs();
        }
        [Comment(
"从一个实例和输入对象的集合返回一个对象和输出对象的集合" )]
        
public   object  Invoke( object  instance,  object [] inputs,  out   object [] outputs)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.Invoke(instance, inputs,  out  outputs);
        }
        [Comment(
"开始异步方法" )]
        
public  IAsyncResult InvokeBegin( object  instance,  object [] inputs, AsyncCallback callback,  object  state)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.InvokeBegin(instance, inputs, callback, state);
        }

        [Comment(
"结束异步方法" )]
        
public   object  InvokeEnd( object  instance,  out   object [] outputs, IAsyncResult result)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.InvokeEnd(instance,  out  outputs, result);
        }

        
public   bool  IsSynchronous
        {
            [Comment(
"获取一个值,该值指定调度程序是调用 Invoke 方法还是调用 InvokeBegin 方法" )]
            get
            {
                ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
                
return   this .inner.IsSynchronous;
            }
        }
    }
    
class  MyInstanceProvider : IInstanceProvider
    {
        Type serviceType;
        
public  MyInstanceProvider(Type serviceType)
        {
            
this .serviceType = serviceType;
        }
        [Comment(
"如果给出指定的 InstanceContext 对象,则返回服务对象" )]
        
public   object  GetInstance(InstanceContext instanceContext, Message message)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return  Activator.CreateInstance( this .serviceType);
        }
        [Comment(
"如果给出指定的 InstanceContext 对象,则返回服务对象" )]
        
public   object  GetInstance(InstanceContext instanceContext)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return  Activator.CreateInstance( this .serviceType);
        }
        [Comment(
"在 InstanceContext 对象回收服务对象时调用" )]
        
public   void  ReleaseInstance(InstanceContext instanceContext,  object  instance)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
    }
    
class  MyInstanceContextProvider : IInstanceContextProvider
    {
        IInstanceContextProvider inner;
        
public  MyInstanceContextProvider(IInstanceContextProvider inner)
        {
            
this .inner = inner;
        }
        [Comment(
"接收新消息时调用" )]
        
public  InstanceContext GetExistingInstanceContext(Message message, IContextChannel channel)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.GetExistingInstanceContext(message, channel);
        }
        [Comment(
"当从 GetExistingInstanceContext 方法返回 null 引用时调用" )]
        
public   void  InitializeInstanceContext(InstanceContext instanceContext, Message message, IContextChannel channel)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
this .inner.InitializeInstanceContext(instanceContext, message, channel);
        }
        [Comment(
"当 InstanceContext 活动完成时调用,以使实施者能阻止 InstanceContext 的回收" )]
        
public   bool  IsIdle(InstanceContext instanceContext)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return   this .inner.IsIdle(instanceContext);
        }
        [Comment(
"当 IsIdle 方法返回 false 时调用,以使实施者能提供回调,从而通知 InstanceContext 对象的完成时间" )]
        
public   void  NotifyIdle(InstanceContextIdleCallback callback, InstanceContext instanceContext)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
this .inner.NotifyIdle(callback, instanceContext);
        }
    }
    
class  MyInstanceContextInitializer : IInstanceContextInitializer
    {
        [Comment(
"用于修改新创建的 InstanceContext 对象" )]
        
public   void  Initialize(InstanceContext instanceContext, Message message)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
    }
    
class  MyChannelInitializer : IChannelInitializer
    {
        ConsoleColor consoleColor;
        
public  MyChannelInitializer( bool  isServer)
        {
            
this .consoleColor = isServer ? ConsoleColor.Cyan : ConsoleColor.Yellow;
        }
        [Comment(
"使用指定的 IClientChannel 来初始化 IChannelInitializer 类" )]
        
public   void  Initialize(IClientChannel channel)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), 
this .consoleColor,  "{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
    }
    
class  MyClientOperationSelector : IClientOperationSelector
    {
        
public   bool  AreParametersRequiredForSelection
        {
            [Comment(
"获取一个值,指示是否需要参数来确定选择" )]
            get
            {
                ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
                
return   false ;
            }
        }
        [Comment(
"返回选择的操作" )]
        
public   string  SelectOperation(MethodBase method,  object [] parameters)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return  method.Name;
        }
    }
    
class  MyInteractiveChannelInitializer : IInteractiveChannelInitializer
    {
        [Comment(
"要开始使用用户接口获取凭据信息的异步调用" )]
        
public  IAsyncResult BeginDisplayInitializationUI(IClientChannel channel, AsyncCallback callback,  object  state)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            Action act = 
new  Action( this .DoNothing);
            
return  act.BeginInvoke(callback, state);
        }
        [Comment(
"当 BeginDisplayInitializationUI 已完成时调用" )]
        
public   void  EndDisplayInitializationUI(IAsyncResult result)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Yellow, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
        }
        
private   void  DoNothing() { }
    }
    
class  MyErrorHandler : IErrorHandler
    {
        [Comment(
"启用错误相关处理并返回一个值,该值指示调度程序在某些情况下是否中止会话和实例上下文" )]
        
public   bool  HandleError(Exception error)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            
return  error  is  ArgumentException;
        }
        [Comment(
"启用创建从服务方法过程中的异常返回的自定义 FaultException(TDetail)" )]
        
public   void  ProvideFault(Exception error, MessageVersion version,  ref  Message fault)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Cyan, 
"{0}.{1}" this .GetType().GetInterfaces().FirstOrDefault().FullName, ReflectionUtil.GetMethodSignature(MethodBase.GetCurrentMethod()));
            MessageFault messageFault = MessageFault.CreateFault(
new  FaultCode( "FaultCode" ),  new  FaultReason(error.Message));
            fault = Message.CreateMessage(version, messageFault, 
"FaultAction" );
        }
    }
    
class  MyBehavior : IOperationBehavior, IContractBehavior,IEndpointBehavior,IServiceBehavior
    {
        
public   void  AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
        {
        }
        
public   void  ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
            clientOperation.Formatter = 
new  MyClientMessageFormatter(clientOperation.Formatter);
            clientOperation.ParameterInspectors.Add(
new  MyParameterInspector( false ));
        }
        
public   void  ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            dispatchOperation.CallContextInitializers.Add(
new  MyCallContextInitializer());
            dispatchOperation.Formatter = 
new  MyDispatchMessageFormatter(dispatchOperation.Formatter);
            dispatchOperation.Invoker = 
new  MyOperationInvoker(dispatchOperation.Invoker);
            dispatchOperation.ParameterInspectors.Add(
new  MyParameterInspector( true ));
        }
        
public   void  Validate(OperationDescription operationDescription)
        {
        }
        
public   void  AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }
        
public   void  ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ChannelInitializers.Add(
new  MyChannelInitializer( false ));
            clientRuntime.InteractiveChannelInitializers.Add(
new  MyInteractiveChannelInitializer());
            clientRuntime.MessageInspectors.Add(
new  MyClientMessageInspector());
            clientRuntime.OperationSelector = 
new  MyClientOperationSelector();
        }
        
public   void  ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
            dispatchRuntime.ChannelDispatcher.ChannelInitializers.Add(
new  MyChannelInitializer( true ));
            dispatchRuntime.ChannelDispatcher.ErrorHandlers.Add(
new  MyErrorHandler());
            dispatchRuntime.InstanceContextInitializers.Add(
new  MyInstanceContextInitializer());
            dispatchRuntime.InstanceContextProvider = 
new  MyInstanceContextProvider(dispatchRuntime.InstanceContextProvider);
            dispatchRuntime.InstanceProvider = 
new  MyInstanceProvider(dispatchRuntime.ChannelDispatcher.Host.Description.ServiceType);
            dispatchRuntime.MessageInspectors.Add(
new  MyDispatchMessageInspector());
            dispatchRuntime.OperationSelector = 
new  MyDispatchOperationSelector();
        }
        
public   void  Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        {
        }
        
public   void  AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            
throw   new  NotImplementedException();
        }
        
public   void  ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            
throw   new  NotImplementedException();
        }
        
public   void  ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            
throw   new  NotImplementedException();
        }
        
public   void  Validate(ServiceEndpoint endpoint)
        {
            
throw   new  NotImplementedException();
        }
        
public   void  AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
            
throw   new  NotImplementedException();
        }
        
public   void  ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            
throw   new  NotImplementedException();
        }
        
public   void  Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            
throw   new  NotImplementedException();
        }
    }
    
static   class  ColorConsole
    {
        
static   object  syncRoot =  new   object ();
        
public   static   void  WriteLine(MethodBase method, ConsoleColor color,  string  text,  params   object [] args)
        {
            var message = method.GetCustomAttributes(
typeof (CommentAttribute),  true ).OfType<CommentAttribute>().FirstOrDefault();
            
if  (args !=  null  && args.Length >  0 )
            {
                text = 
string .Format(CultureInfo.InvariantCulture, text, args);
            }
            
lock  (syncRoot)
            {
                Console.ForegroundColor = color;
                
if  (message ==  null )
                    Console.WriteLine(
"[{0}] 执行方法: {1}" , DateTime.Now.ToString( "HH:mm:ss.fff" , CultureInfo.InvariantCulture), text);
                
else
                    Console.WriteLine(
"[{0}] //{1} 方法定义: {2}" , DateTime.Now.ToString( "HH:mm:ss.fff" , CultureInfo.InvariantCulture),message.Message, text);
                Console.ResetColor();
            }
            Thread.Sleep(
50 );
        }
        
public   static   void  WriteLine( string  text,  params   object [] args)
        {
            Console.WriteLine(text, args);
        }
        
public   static   void  WriteLine( object  obj)
        {
            Console.WriteLine(obj);
        }
    }
    
static   class  ReflectionUtil
    {
        
public   static   string  GetMethodSignature(MethodBase method)
        {
            StringBuilder sb = 
new  StringBuilder();
            sb.Append(method.Name);
            sb.Append(
"(" );
            ParameterInfo[] parameters = method.GetParameters();
            
for  ( int  i =  0 ; i < parameters.Length; i++)
            {
                
if  (i >  0 ) sb.Append( ", " );
                sb.Append(parameters[i].ParameterType.Name);
            }
            sb.Append(
")" );
            
return  sb.ToString();
        }
    }
    [ServiceContract]
    
public   interface  ITest
    {
        [OperationContract]
        
int  Add( int  x,  int  y);
        [OperationContract(IsOneWay = 
true )]
        
void  Process( string  text);
    }
    [ServiceBehavior(IncludeExceptionDetailInFaults = 
true )]
    
public   class  Service : ITest
    {
        
public   int  Add( int  x,  int  y)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Green, 
"执行服务方法 '{0}'" , MethodBase.GetCurrentMethod().Name);
            
if  (x ==  0  && y ==  0 )
            {
                
throw   new  ArgumentException( "出现一个异常,这是异常消息" );
            }
            
else
            {
                
return  x + y;
            }
        }
        
public   void  Process( string  text)
        {
            ColorConsole.WriteLine(MethodBase.GetCurrentMethod(), ConsoleColor.Green, 
"执行服务方法 '{0}'" , MethodBase.GetCurrentMethod().Name);
        }
    }
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
string  baseAddress =  "http://"  + Environment.MachineName +  ":8000/Service" ;
            
//配置一个服务主机
             using  (ServiceHost host =  new  ServiceHost( typeof (Service),  new  Uri(baseAddress)))
            {
                
//为主机添加一个服务终结点
                ServiceEndpoint endpoint = host.AddServiceEndpoint( typeof (ITest),  new  BasicHttpBinding(),  "" );
                
//为服务终结点添加自定义服务行为
                endpoint.Contract.Behaviors.Add( new  MyBehavior());
                
foreach  (OperationDescription operation  in  endpoint.Contract.Operations)
                {
                    operation.Behaviors.Add(
new  MyBehavior());
                }
                host.Open();
                ColorConsole.WriteLine(
"打开服务" );
                
using  (ChannelFactory<ITest> factory =  new  ChannelFactory<ITest>( new  BasicHttpBinding(),  new  EndpointAddress(baseAddress)))
                {
                    factory.Endpoint.Contract.Behaviors.Add(
new  MyBehavior());
                    
foreach  (OperationDescription operation  in  factory.Endpoint.Contract.Operations)
                    {
                        operation.Behaviors.Add(
new  MyBehavior());
                    }
                    ITest proxy = factory.CreateChannel();
                    ColorConsole.WriteLine(
"即将调用服务" );
                 
//   ColorConsole.WriteLine(proxy.Add(3, 4));
                   //  ColorConsole.WriteLine("服务调用完成,再次调用服务,这次服务执行过程中会产生异常");
                     try
                    {
                        ColorConsole.WriteLine(proxy.Add(
0 0 ));
                    }
                    
catch  (Exception e)
                    {
                        ColorConsole.WriteLine(
"{0}: {1}" , e.GetType().Name, e.Message);
                    }
                    
//ColorConsole.WriteLine("现在开始调用单向的服务");
                     //proxy.Process("hello");
                    ((IClientChannel)proxy).Close();
                }
            }
            ColorConsole.WriteLine(
"完成" );
        }
    }
}

转载于:https://www.cnblogs.com/micro-chen/p/4134543.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值