Altering the SOAP Message Using SOAP Extensions http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconalteringsoapmessageusingsoapextensions.asp
代码是我一个工程的片断,为了更明确说明问题贴上来的时候做了改动,BehaviorElement的实现还是贴错了,修正为 public class BehaviorElement : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(Behavior); } } protected override object CreateBehavior() { return new Behavior(); } }
WebService 本来就是通过 HTTP 明文传输的
除非用了 SSL
不然都能截出来
怎么个截法;在微软的社区中也没有人知道。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconalteringsoapmessageusingsoapextensions.asp
不过对于的需求似乎有些类似的地方
"Altering" the SOAP Message Using SOAP Extensions
以前很多人都用ContextBoundObject个来实现拦截、修改调用请求,现在wcf都帮你做好了,具体做法如下(只解释怎么做service拦截):实现一个IServiceBehavior接口,在应用behavior的时候添加拦截器(ApplyDispatchBehavior方法):
public class Behavior : IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
return null;
} public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher enDisp in chDisp.Endpoints)
{
//此处service拦截器,不是必须添加
//enDisp.DispatchRuntime.MessageInspectors.Add(new Inspector());
//为每个operationt添加拦截器
foreach (DispatchOperation op in enDisp.DispatchRuntime.Operations)
{
op.ParameterInspectors.Add(new Inspector());
}
}
}
} public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
return null;
}
}为配置文件的behavior节增加一个扩展元素(实现抽象类BehaviorExtensionElement):
public class BehaviorElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(MyBehavior); }
} protected override object CreateBehavior()
{
return new MyBehavior(InspectorType);
}
}定义拦截类(实现IParameterInspector,如果是需要对service所有消息进行拦截还需实现IDispatchMessageInspector)
public class Inspector : IParameterInspector
{
public Inspector()
{
} #region IParameterInspector Members public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
Console.WriteLine("after call");
} public object BeforeCall(string operationName, object[] inputs)
{
Console.WriteLine("before call");
return null;
} #endregion
}
修改配置文件,为service指定自定义的behavior
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="Behavior" type="Behavior.BehaviorElement, Behavior, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<services>
<service behaviorConfiguration="MyBehavior" name="xxxx">
<endpoint address="xxxxxx"
binding="xxxxx" bindingConfiguration="xxxx"
name="xxxx" contract="xxxxxx" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Behavior">
<Behavior/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>启动后客户端所有请求都会被自定义的behavior先拦截掉,并可以按情况修改。
<service behaviorConfiguration="MyBehavior" name="xxxx">
<endpoint address="xxxxxx"
binding="xxxxx" bindingConfiguration="xxxx"
name="xxxx" contract="xxxxxx" />
应为
<service behaviorConfiguration="Behavior" name="xxxx">
<endpoint address="xxxxxx"
binding="xxxxx" bindingConfiguration="xxxx"
name="xxxx" contract="xxxxxx" />
public class BehaviorElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(Behavior); }
} protected override object CreateBehavior()
{
return new Behavior();
}
}