WCF 在每个服务方法调用之前执行的一种方法
Posted
技术标签:
【中文标题】WCF 在每个服务方法调用之前执行的一种方法【英文标题】:WCF One method to execute before every service method's call 【发布时间】:2015-12-01 03:55:33 【问题描述】:我正在寻找一种在服务器端,在每个请求方法的调用中执行特定方法的方法。
这是为了安全验证,但不仅仅是。
这与this question 没有重复,因为我们的意思是完全不同的东西。另外,那里的所有相关答案都有不可用的链接,因此不可能得到正确的答案。
(抱歉这里没有附上任何代码,本期没有指定代码)。
【问题讨论】:
Force WCF to call a method on every request before entering actual function的可能重复 这可能是重复的,但那里没有对我有帮助的答案,而且几乎所有链接都不可用。 您能否解释一下为什么@Matthieu 提到的链接对您没有帮助,以便我们提供其他想法?这是一种拦截请求的简单方法,您可以在其中执行所需的任何代码。 另见:***.com/questions/39773448/… 【参考方案1】:最好的解决方案是创建 WCF 自定义行为。
您可以通过几个简单的步骤来做到这一点:
客户端:
public class FillHeaderDataBehaviourExtension : BehaviorExtensionElement, IEndpointBehavior
#region BehaviorExtensionElement Implementation
public override Type BehaviorType
get
return typeof(FillHeaderDataBehaviourExtension);
protected override object CreateBehavior()
return this;
#endregion
#region IServiceBehaviour Implementation
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
public void Validate(ServiceEndpoint endpoint)
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
clientRuntime.ClientMessageInspectors.Add(new MessageInspector());
#endregion
public class MessageInspector : IClientMessageInspector
public object BeforeSendRequest(ref Message request, IClientChannel channel)
MessageHeader header = MessageHeader.CreateHeader("HeaderData", String.Empty, HeaderDataVM.GetInstance().GetBaseInstance());
request.Headers.Add(header); // There is no need for checking if exist before adding. Every request has it's own headers.
return null;
public void AfterReceiveReply(ref Message reply, object correlationState)
服务器端:
public class ExtractHeadersBehaviourExtension : BehaviorExtensionElement, IServiceBehavior
#region BehaviorExtensionElement Implementation
public override Type BehaviorType
get
return typeof(ExtractHeadersBehaviourExtension);
protected override object CreateBehavior()
return this;
#endregion
#region IServiceBehavior Implementation
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
for (int i = 0; i < serviceHostBase.ChannelDispatchers.Count; i++)
ChannelDispatcher channelDispatcher = serviceHostBase.ChannelDispatchers[i] as ChannelDispatcher;
if (channelDispatcher != null)
foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
MessageInspector inspector = new MessageInspector();
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
#endregion
public class MessageInspector : IDispatchMessageInspector
public void BeforeSendReply(ref Message reply, object correlationState)
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
HeaderData headerData = request.Headers.GetHeader<HeaderData>("HeaderData", String.Empty);
if(headerData != null)
OperationContext.Current.IncomingMessageProperties.Add("HeaderData", headerData);
return null;
最后,别忘了在 app.config 文件(客户端和服务器端)中进行如下配置:
<behaviors>
<endpointBehaviors>
<behavior name="NewBehavior">
<fillHeaderDataBehaviourExtension/>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
您还可以通过 WCF 配置编辑器添加这些行。为此,请查看this 答案。
编辑:添加这些配置代码行后,您可能会在应用配置中遇到错误:
不用担心,您的应用程序会运行良好。这是因为 GAC(全局程序集缓存)文件夹不包含此行为(因为它是自定义行为)。您可以通过手动将此行为添加到计算机上的 GAC 文件夹来修复它。 但是,此错误可能会阻止您更新服务参考。如果您尝试这样做,您将收到以下错误消息:
因此,当您更新服务参考时,只需注释掉这一行 (<extractHeadersBehaviourExtension/>
)(在客户端和服务器端)。
来源:How to add behavior on a specific endpoint? & Adding Custom Message Headers to a WCF Service
【讨论】:
以上是关于WCF 在每个服务方法调用之前执行的一种方法的主要内容,如果未能解决你的问题,请参考以下文章