1 public class MyOperationBehavior:Attribute, IOperationBehavior
2 {
3 public void AddBindingParameters(OperationDescription operationDescription,
4 System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
5 {
6 Logger.Log("MyOperationBehavior",
7 "AddBindingParameters", operationDescription.Name);
8 }
9
10 public void ApplyClientBehavior(OperationDescription operationDescription,
11 System.ServiceModel.Dispatcher.ClientOperation clientOperation)
12 {
13 clientOperation.ParameterInspectors.Add(new MyParameterInspector());
14 Logger.Log("MyOperationBehavior",
15 "ApplyClientBehavior", operationDescription.Name);
16 }
17
18 public void ApplyDispatchBehavior(OperationDescription operationDescription,
19 System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
20 {
21 dispatchOperation.ParameterInspectors.Add(new MyParameterInspector());
22 Logger.Log("MyOperationBehavior",
23 "ApplyDispatchBehavior", operationDescription.Name);
24 }
25
26 public void Validate(OperationDescription operationDescription)
27 {
28 Logger.Log("MyOperationBehavior", "Validate", operationDescription.Name);
29 }
30 }
 1 public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior
2 {
3
4 public void AddBindingParameters(ServiceDescription serviceDescription,
5 ServiceHostBase serviceHostBase,
6 Collection<ServiceEndpoint> endpoints,
7 BindingParameterCollection bindingParameters)
8 {
9 Logger.Log("MyServiceBehaviorAttribute",
10 "AddBindingParameters", serviceDescription.Name);
11 }
12 public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
13 ServiceHostBase serviceHostBase)
14 {
15 Logger.Log("MyServiceBehaviorAttribute",
16 "ApplyDispatchBehavior", serviceDescription.Name);
17 }
18 public void Validate(ServiceDescription serviceDescription,
19 ServiceHostBase serviceHostBase)
20 {
21 Logger.Log("MyServiceBehaviorAttribute",
22 "Validate", serviceDescription.Name);
23 }
24 }
 1 public class MyParameterInspector:IParameterInspector
2 {
3 public void AfterCall(string operationName, object[] outputs,
4 object returnValue, object correlationState)
5 {
6 Logger.Log("MyParameterInspector", "AfterCall", operationName);
7 }
8
9 public object BeforeCall(string operationName, object[] inputs)
10 {
11 Logger.Log("MyParameterInspector", "BeforeCall", operationName);
12 return null;
13 }
14 }
  1     public class MyParameterInspector: IOperationBehavior, IParameterInspector
2 {
3 #region IOperationBehavior Members
4 /// <summary>
5 ///
6 /// </summary>
7 /// <param name="operationDescription"></param>
8 /// <param name="bindingParameters"></param>
9 public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
10 {
11
12 }
13 /// <summary>
14 ///
15 /// </summary>
16 /// <param name="operationDescription"></param>
17 /// <param name="clientOperation"></param>
18 public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
19 {
20
21 }
22 /// <summary>
23 ///
24 /// </summary>
25 /// <param name="operationDescription"></param>
26 /// <param name="dispatchOperation"></param>
27 public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
28 {
29 dispatchOperation.ParameterInspectors.Add(this);
30 }
31
32 /// <summary>
33 ///
34 /// </summary>
35 /// <param name="operationDescription"></param>
36 public void Validate(OperationDescription operationDescription)
37 {
38
39 }
40
41 #endregion
42
43
44 /// <summary>
45 /// 调用方法后 输出结果值
46 /// </summary>
47 /// <param name="operationName"></param>
48 /// <param name="outputs"></param>
49 /// <param name="returnValue"></param>
50 /// <param name="correlationState"></param>
51 public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
52 {
53 Console.WriteLine("*************返回操作名称:" + operationName+"*************");
54 Console.WriteLine("*************返回操作编号:" + correlationState.ToString() + "**************");
55 for (int i = 0; i < outputs.Length; i++)
56 {
57
58 Type T = outputs[i].GetType();
59 Console.WriteLine("返回操作参数" + i.ToString() + " 类型为:" + T.ToString());
60 Console.WriteLine("返回操作参数" + i.ToString() + " ToString为:" + outputs[i].ToString());
61 Console.WriteLine("返回操作参数" + i.ToString() + " 属性:");
62 PropertyInfo[] PIs = T.GetProperties();
63 foreach (PropertyInfo PI in PIs)
64 {
65 Console.Write(PI.Name + ":");
66 Console.WriteLine(PI.GetValue(outputs[i], null));
67 }
68
69
70 }
71
72 Type Treturn = returnValue.GetType();
73 Console.WriteLine("操作返回值" + " 类型为:" + Treturn.ToString());
74 Console.WriteLine("操作返回值" + " ToString为:" + Treturn.ToString());
75 Console.WriteLine("操作返回值" + " 属性:");
76
77 if (Treturn.ToString() != "System.String")
78 {
79 PropertyInfo[] PIreturns = Treturn.GetProperties();
80 foreach (PropertyInfo PI in PIreturns)
81 {
82 Console.Write(PI.Name + ":");
83 Console.WriteLine(PI.GetValue(returnValue, null));
84 }
85 }
86
87
88 }
89 /// <summary>
90 /// 调用方法前 输出参数值
91 /// </summary>
92 /// <param name="operationName"></param>
93 /// <param name="inputs"></param>
94 /// <returns></returns>
95 public object BeforeCall(string operationName, object[] inputs)
96 {
97 Guid guid = Guid.NewGuid();
98
99 Console.WriteLine("*************调用操作名称:" + operationName+"**************");
100 Console.WriteLine("*************调用操作编号:" + guid.ToString () + "**************");
101 for (int i = 0; i < inputs.Length ; i++)
102 {
103
104 Type T = inputs[i] .GetType ();
105 Console.WriteLine("操作参数"+i.ToString ()+" 类型为:"+T.ToString ());
106 Console.WriteLine("操作参数" + i.ToString() + " ToString为:" + inputs[i].ToString());
107 Console.WriteLine("操作参数" + i.ToString() + " 属性:");
108 PropertyInfo [] PIs = T.GetProperties();
109 foreach (PropertyInfo PI in PIs)
110 {
111 Console.Write ( PI.Name +":");
112 Console.WriteLine (PI.GetValue(inputs[i], null));
113 }
114
115 }
116 return guid;
117 }
118
119
120 }

IServiceBehavior, IOperationBehavior,IParameterInspector的更多相关文章

  1. Extending WCF using IServiceBehavior, IOperationBehavior, and IParameterInspector

    [ServiceContract(Name = "PasswordGenerator")] public interface IPasswordGenerator { [Opera ...

  2. IServiceBehavior IContractBehavior IEndpointBehavior IOperationBehavior

    using System; using System.Collections.ObjectModel; using System.Reflection; using System.ServiceMod ...

  3. 转 使用IParameterInspector, IOperationBehavior,Attribute(参数检查器、操作行为接口和标签)扩展WCF操作行为

    public class EntryIdInspector : IParameterInspector { public int intParamIndex { get; set; } string ...

  4. Wcf实现IServiceBehavior拓展机制

    IServiceBehavior接口 描述:提供一种在整个服务内修改或插入自定义拓展机制: 命名空间:  System.ServiceModel.Description程序集:  System.Ser ...

  5. WCF自定义扩展,以实现aop!

    引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx  使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...

  6. 真实世界:使用WCF扩展记录服务调用时间

    WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服 ...

  7. WCF扩展

    WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服 ...

  8. WCF的执行过程

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

  9. WCF Service端Inspector

    问题 在使用WCF的过程中,有时候需要在service端截取client和service之间的消息来做一些如写log,检查message是否合法的操作. 那么如何才能实现呢? 解决方案 使用WCF提供 ...

  10. 使用WCF扩展记录服务调用时间

    随笔- 64  文章- 0  评论- 549  真实世界:使用WCF扩展记录服务调用时间   WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Lay ...

随机推荐

  1. python中的代码运行时间获取方式

    python中的代码运行时间获取方式 ​ 我们知道为了提高代码的运行速度,我们需要对书写的python代码进行性能测试,而代码性能的高低的直接反馈就是电脑运行代码所需要的时间. 使用time模块对代码 ...

  2. 【Java爬虫】如何通过 API 递归分页爬取网页数据

    前言 在最近的互联网项目开发中,需要获取用户的访问ip信息进行统计的需求,用户的访问方式可能会从微信内置浏览器.Windows浏览器等方式对产品进行访问. 当然,获取这些关于ip的信息是合法的.但是, ...

  3. Educational Codeforces Round 92 (Rated for Div. 2) A~C

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 最近写学习了一下网络爬虫,但昨天晚上的CF让人感觉实力明显退步,又滚回来刷题了QAQ... 比赛 ...

  4. 聊聊与前端工程师天然互补的 Serverless

    作者:灵轮_(阿里云前端技术专家)_ 作为前端工程师,我们的使命是为用户提供良好的前端用户体验.随着云原生时代的到来,显而易见的,我们能做的更多了.Serverless 产品的特点是免运维.按量付费和 ...

  5. 2 Englishi 词根

    11 mis 错 misuse misfortune misunderstand 12 out 超过: 外 outnumber outspend outdoor 13 over 过度 overprai ...

  6. 针对docker中的mongo容器增加鉴权

    1. 背景 业务方的服务器经安全检查,发现以docker容器启动的mongo未增加鉴权的漏洞,随优化之 2. 配置 mongo以docker compose方式启动,镜像的版本号为4.2.6,dock ...

  7. 修改Keil uvison4 字体样式

    1.点击扳手配置 2.点击Colors & Fonts,选择其中的8051:Editor C Files,选择Text,点击右侧的Courier New... 3.在里面就可以调节字体了

  8. [转帖]十九、Linux性能优化实战学习笔记- 为什么系统的Swap变高了?

    目录 一.什么是文件页?什么是脏页?什么是匿名页? 二.linux swap原理 换出 换入 三.内存回收的时机 1.直接内存回收 2.kswapd0内核线程 四.NUMA 与 Swap关系 五.sw ...

  9. [转帖]How fast are Unix domain sockets?

    https://blog.myhro.info/2017/01/how-fast-are-unix-domain-sockets Jan 3, 2017 • Tiago Ilieve Warning: ...

  10. Tidb异名恢复Mysql数据库的过程

    Tidb异名恢复Mysql数据库的过程 背景 先说坑: TiDB备份恢复的方式 1. mysqldump + mysql source 的方式. 2. mydumper + loader tidb 的 ...