IServiceBehavior, IOperationBehavior,IParameterInspector
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的更多相关文章
- Extending WCF using IServiceBehavior, IOperationBehavior, and IParameterInspector
[ServiceContract(Name = "PasswordGenerator")] public interface IPasswordGenerator { [Opera ...
- IServiceBehavior IContractBehavior IEndpointBehavior IOperationBehavior
using System; using System.Collections.ObjectModel; using System.Reflection; using System.ServiceMod ...
- 转 使用IParameterInspector, IOperationBehavior,Attribute(参数检查器、操作行为接口和标签)扩展WCF操作行为
public class EntryIdInspector : IParameterInspector { public int intParamIndex { get; set; } string ...
- Wcf实现IServiceBehavior拓展机制
IServiceBehavior接口 描述:提供一种在整个服务内修改或插入自定义拓展机制: 命名空间: System.ServiceModel.Description程序集: System.Ser ...
- WCF自定义扩展,以实现aop!
引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx 使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...
- 真实世界:使用WCF扩展记录服务调用时间
WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服 ...
- WCF扩展
WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服 ...
- WCF的执行过程
既然是实现互通信.那么肯定会有概念意义上的服务端Server 和概念意义上的客户端 Client,在这里,我所说明的都是概念意义上的,单独强调此,是因为,基于WCF的通信没有物理上的划分,但是概念上 ...
- WCF Service端Inspector
问题 在使用WCF的过程中,有时候需要在service端截取client和service之间的消息来做一些如写log,检查message是否合法的操作. 那么如何才能实现呢? 解决方案 使用WCF提供 ...
- 使用WCF扩展记录服务调用时间
随笔- 64 文章- 0 评论- 549 真实世界:使用WCF扩展记录服务调用时间 WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Lay ...
随机推荐
- faker造数据
faker是一个开源的python库,安装完成后只需要调用Facker库,就可以帮助我们创建需要的数据. pip install Faker demo from faker import Faker ...
- 【python爬虫】 request模块介绍 http协议版本区别 双token认证 携带cookie的两种方式 requests.session的使用 post请求携带数据编码格式 request.text编码问题 下载图片,视频
目录 上节回顾 今日内容 1 爬虫介绍 2 request模块介绍 3 request发送get请求 4 request携带参数 5 url编码解码 6 携带请求头 http协议版本之间的区别 7 发 ...
- 用 ChatGPT 写一篇《ChatGPT 会取代我们的工作吗》
自从 ChatGPT 火爆以后,最常谈到的话题就是 ChatGPT 会取代我们的工作吗?在写这篇内容时我有个大胆的想法,那就是让 ChatGPT 来取代我的工作. 首先,我决定直接让 ChatGPT ...
- 【HZERO】班翎工作流
班翎工作流 工作流流程 流程分类定义 接口管理 long类型写0 字符串写空 流程定义[画流程图] 人工节点-添加审批人规则 空-全局事件-选回调接口 我的待办 流程平台-我参与的流程 发起流程:wo ...
- Three.js 入门
Demo代码地址: https://gitee.com/s0611163/three.js-demo Three.js Three.js下载 从GitHub上下载一个Release版本,https:/ ...
- C# async await 异步执行方法封装 替代 BackgroundWorker
BackWork代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...
- AtCoder Beginner Contest 217 D~E
比赛链接:Here ABC水题, D - Cutting Woods 题意:开始一根木棒长度为 \(n\) 并以 \(1\) 为单位在木棒上标记\((1\sim n)\) ,输出 \(q\) 次操作 ...
- 2020年第十一届蓝桥杯省赛 第二场(10月17日)B组个人题解
A 找出来1到2020之间数位为2的数量. 不用特别去考虑,直接循环即可 B 求分子分母最小因子为1的. 跑两个for循环,写一个gcd就可以了 答案:2481215 int main() { // ...
- uniapp#实现自定义省市区三级联动
uni-APP中的三级联动(省市区)---数据前端写死 https://blog.csdn.net/lwaner/article/details/107150805 uniapp#实现自定义省市区三级 ...
- proxy代理