[ServiceContract(Name = "PasswordGenerator")]
public interface IPasswordGenerator
{
[OperationContract(Name = "GeneratePassword")]
string GeneratePassword();
[OperationContract(Name="ParameterizedPasswordGenerator")]
string GeneratePassword(int length);
} public class PasswordGenerator:IPasswordGenerator
{
[OperationBehavior()]
public string GeneratePassword()
{
return "You called GeneratePassword()";
} [OperationBehavior()]
public string GeneratePassword(int length)
{
return "You called GeneratePassword(int length) overload";
}
}

  

static void Main(string[] args)
{
ServiceEndpoint serviceEndpoint;
Uri basePipeAddress = new Uri(@"net.Pipe://localhost/Password/Mine");
using (ServiceHost host =
new ServiceHost(typeof(Password.PasswordGenerator), basePipeAddress))
{
serviceEndpoint = host.AddServiceEndpoint(typeof(
Password.IPasswordGenerator), new NetNamedPipeBinding(), string.Empty);
host.Open(); using (var factory = new
ChannelFactory<password.passwordgenerator>(new NetNamedPipeBinding()))
{
var proxy = factory.CreateChannel(serviceEndpoint.Address);
proxy.GeneratePassword();
proxy.GeneratePassword(1500);
factory.Close();
}
host.Close();
}
}

  

public static class Logger
{
private static void Log(string message)
{
try
{
using (var stream = new StreamWriter(@"G:\log.log", true))
{
stream.WriteLine(message); stream.Flush();
stream.Close();
}
}
catch (Exception)
{ }
}
public static void Log(string className, string methodName, string parameter)
{
Log(string.Format("Class {0} called method {1} with parameter {2} @ {3}",
className, methodName, parameter, DateTime.Now));
} }

  First Extension

public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior
{ public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
Logger.Log("MyServiceBehaviorAttribute",
"AddBindingParameters", serviceDescription.Name);
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
Logger.Log("MyServiceBehaviorAttribute",
"ApplyDispatchBehavior", serviceDescription.Name);
}
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
Logger.Log("MyServiceBehaviorAttribute",
"Validate", serviceDescription.Name);
}
}

  Second Extension

public class MyOperationBehavior:Attribute, IOperationBehavior
{
public void AddBindingParameters(OperationDescription operationDescription,
System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
Logger.Log("MyOperationBehavior",
"AddBindingParameters", operationDescription.Name);
} public void ApplyClientBehavior(OperationDescription operationDescription,
System.ServiceModel.Dispatcher.ClientOperation clientOperation)
{
clientOperation.ParameterInspectors.Add(new MyParameterInspector());
Logger.Log("MyOperationBehavior",
"ApplyClientBehavior", operationDescription.Name);
} public void ApplyDispatchBehavior(OperationDescription operationDescription,
System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
{
dispatchOperation.ParameterInspectors.Add(new MyParameterInspector());
Logger.Log("MyOperationBehavior",
"ApplyDispatchBehavior", operationDescription.Name);
} public void Validate(OperationDescription operationDescription)
{
Logger.Log("MyOperationBehavior", "Validate", operationDescription.Name);
}
}

  Third Extension

class MyParameterInspector:IParameterInspector
{
public void AfterCall(string operationName, object[] outputs,
object returnValue, object correlationState)
{
Logger.Log("MyParameterInspector", "AfterCall", operationName);
} public object BeforeCall(string operationName, object[] inputs)
{
Logger.Log("MyParameterInspector", "BeforeCall", operationName);
return null;
}
}

  

[__strong__][MyServiceBehaviorAttribute()]
public class PasswordGenerator:IPasswordGenerator
{
[OperationBehavior(),MyOperationBehavior]
public string GeneratePassword()
{
return "You called GeneratePassword()";
} [OperationBehavior()]
[MyOperationBehavior]
public string GeneratePassword(int length)
{
return "You called GeneratePassword(int length) overload";
}

  

---------------------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Reflection; namespace AOPAndWCF
{
class MyParameterInspector: IOperationBehavior, IParameterInspector
{
#region IOperationBehavior Members
/// <summary>
///
/// </summary>
/// <param name="operationDescription"></param>
/// <param name="bindingParameters"></param>
public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{ }
/// <summary>
///
/// </summary>
/// <param name="operationDescription"></param>
/// <param name="clientOperation"></param>
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{ }
/// <summary>
///
/// </summary>
/// <param name="operationDescription"></param>
/// <param name="dispatchOperation"></param>
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
dispatchOperation.ParameterInspectors.Add(this);
} /// <summary>
///
/// </summary>
/// <param name="operationDescription"></param>
public void Validate(OperationDescription operationDescription)
{ } #endregion /// <summary>
/// 调用方法后 输出结果值
/// </summary>
/// <param name="operationName"></param>
/// <param name="outputs"></param>
/// <param name="returnValue"></param>
/// <param name="correlationState"></param>
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
Console.WriteLine("*************返回操作名称:" + operationName+"*************");
Console.WriteLine("*************返回操作编号:" + correlationState.ToString() + "**************");
for (int i = 0; i < outputs.Length; i++)
{ Type T = outputs[i].GetType();
Console.WriteLine("返回操作参数" + i.ToString() + " 类型为:" + T.ToString());
Console.WriteLine("返回操作参数" + i.ToString() + " ToString为:" + outputs[i].ToString());
Console.WriteLine("返回操作参数" + i.ToString() + " 属性:");
PropertyInfo[] PIs = T.GetProperties();
foreach (PropertyInfo PI in PIs)
{
Console.Write(PI.Name + ":");
Console.WriteLine(PI.GetValue(outputs[i], null));
} } Type Treturn = returnValue.GetType();
Console.WriteLine("操作返回值" + " 类型为:" + Treturn.ToString());
Console.WriteLine("操作返回值" + " ToString为:" + Treturn.ToString());
Console.WriteLine("操作返回值" + " 属性:"); if (Treturn.ToString() != "System.String")
{
PropertyInfo[] PIreturns = Treturn.GetProperties();
foreach (PropertyInfo PI in PIreturns)
{
Console.Write(PI.Name + ":");
Console.WriteLine(PI.GetValue(returnValue, null));
}
} }
/// <summary>
/// 调用方法前 输出参数值
/// </summary>
/// <param name="operationName"></param>
/// <param name="inputs"></param>
/// <returns></returns>
public object BeforeCall(string operationName, object[] inputs)
{
Guid guid = Guid.NewGuid(); Console.WriteLine("*************调用操作名称:" + operationName+"**************");
Console.WriteLine("*************调用操作编号:" + guid.ToString () + "**************");
for (int i = 0; i < inputs.Length ; i++)
{ Type T = inputs[i] .GetType ();
Console.WriteLine("操作参数"+i.ToString ()+" 类型为:"+T.ToString ());
Console.WriteLine("操作参数" + i.ToString() + " ToString为:" + inputs[i].ToString());
Console.WriteLine("操作参数" + i.ToString() + " 属性:");
PropertyInfo [] PIs = T.GetProperties();
foreach (PropertyInfo PI in PIs)
{
Console.Write ( PI.Name +":");
Console.WriteLine (PI.GetValue(inputs[i], null));
} }
return guid;
} }
}

  

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel ;
using System.ServiceModel.Description;
namespace AOPAndWCF
{
public class MyServiceHost:ServiceHost
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="serviceType">服务类型</param>
/// <param name="baseAddresses">基地址</param>
public MyServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { } /// <summary>
/// 应用配置文件设置
/// </summary>
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
//加入参数检查服务
addguidvalidation(); } /// <summary>
///加入参数检查服务
/// </summary>
private void addguidvalidation()
{
//加入参数检查服务
int endpointscount = this.Description.Endpoints.Count;
MyParameterInspector mypi = new MyParameterInspector();
for (int i = 0; i < endpointscount; i++)
{
if (this.Description.Endpoints[i].Contract.Name != "IMetadataExchange")
{
int Operationscount = this.Description.Endpoints[i].Contract.Operations.Count;
for (int j = 0; j < Operationscount; j++)
{
this.Description.Endpoints[i].Contract.Operations[j].Behaviors.Add(mypi);
}
}
}
} }
}

  

using System;
using System.Collections.Generic;
using System.Text; namespace AOPAndWCF
{
class Program
{
static void Main(string[] args)
{
MyServiceHost msh = new MyServiceHost(typeof(WcfServiceLibrary.Service1 ));
msh.Open();
Console.WriteLine ("服务已开启,回车关闭服务");
Console.ReadLine();
msh.Close(); }
}
}

  

Extending WCF using IServiceBehavior, IOperationBehavior, and IParameterInspector的更多相关文章

  1. Wcf实现IServiceBehavior拓展机制

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

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

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

  3. WCF扩展

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

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

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

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

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

  6. WCF笔记

    http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iparameterinspector.aftercall ...

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

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

  8. IServiceBehavior IContractBehavior IEndpointBehavior IOperationBehavior

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

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

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

随机推荐

  1. 在dubbo工程中,使用druid监控

    介绍:在dubbo项目中,使用druid的监控功能 问题:因为,在网上找勒,很多的资料,显示的都是需要在web.xml中配置 <servlet> <servlet-name>D ...

  2. Flutter ------- WebView加载网页

    在Flutter 加载网页?也是有WebView的哦,和Android一样 1.添加依赖 dependencies: flutter_webview_plugin: ^0.2.1+2 2.导入库 im ...

  3. C# Area 双重路由

    在WebApi项目里面 一般除了接口, 还有管理端...一些乱七八糟的,你想展示的东西, 一种做法是分开写: 比如管理后台一个项目, 然后接口一个, 然后页面一个, 其实这样做也可以,但是这么做, 无 ...

  4. [原][OE][官方例子]osgearth_features OE地球添加shp文件(特征标识)

    OE所有官方样例 官方示例代码 /* -*-c++-*- */ /* osgEarth - Dynamic map generation toolkit for OpenSceneGraph * Co ...

  5. 初始化html font-size

    (function () { var docEl = document.documentElement, resizeEvt = 'orientationchange' in window ? 'or ...

  6. Hive Essential (4):DML-project,filter,join,union

    1. Project data with SELECT The most common use case for Hive is to query data in Hadoop. To achieve ...

  7. 【翻译】Flink Joining

    本文来自官网翻译: Joining Window Join(窗口join) Tumbling Window Join(翻滚窗口join) Sliding Window Join(滑动窗口join) S ...

  8. js Date.parse()时区问题

    比较两个时间,parse() 方法可解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数.Date.parse时间多了8小时. 正确的方法: var nowDate = Dat ...

  9. LeetCode_290. Word Pattern

    290. Word Pattern Easy Given a pattern and a string str, find if str follows the same pattern. Here  ...

  10. CompletableFuture Quasar 等并发编程

    CompletableFuture基本用法 https://www.cnblogs.com/cjsblog/p/9267163.html Quasar https://blog.csdn.net/ma ...