2011-09-20 45 views
5

我有一个WCF服务,它有多个Web方法。我希望能够拦截所有方法的请求并查看IP地址。 Id宁愿不把逻辑放到每个被调用Web方法顶部的方法调用中,是否有办法从一个地方拦截对这些方法的所有调用?如何拦截对WCF .svc服务中的方法的所有调用?

如果这是一个页面,我会写一个基本页面对象,但不确定是否有在wcf调用中引发的事件?

+0

您可以使用在WCF [检查员]检查员(https://web.archive.org/web/20120207232924/http://cgeers.com:80/2008/11/09/wcf-extensibility-parameter -inspectors /) – dhinesh

+0

上面的评论链接来自@dhinesh似乎加载了恶意软件的页面,并要求我安装Chrome扩展程序。我已经向主持人汇报过了。 – Volomike

+0

我想建议你删除asp.net标签,因为你的问题比asp.net广泛得多,对于C#编码器和VB编码器也可以非常有用。 – Volomike

回答

3

WCF允许您实现添加到堆栈的拦截器。一个例子见link。我不确定这是否允许您提取发件人IP,但我认为这值得一试。

3

您可以实现IDispatchMessageInspector并执行此类操作。

public object AfterReceiveRequest(ref Message request, 
IClientChannel channel, InstanceContext instanceContext) 
    { 
     RemoteEndpointMessageProperty remoteEndpoint = request.Properties 
    [RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 

     //remoteEndpoint.Address will give you the address. 

     return null; 
    } 
+0

在'host.Open()'调用之前有没有简单的方法将它附加到WCF服务?我唯一看到的是我必须创建一个特殊的行为,绑定和消息检查器。我试图解决这个问题,最终放弃了我的头发。然后我发现了'ServiceAuthorizationManager'。 – Volomike

1

有一个聪明的办法与ServiceAuthorizationManager要做到这一点,这是远远超过了IDispatchMessageInspector的所有认真勤奋工作更轻松。

创建WCF服务项目类,像这样:

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
    string classMethod = operationContext.RequestContext.RequestMessage.Headers.Action; 
    if (classMethod.Contains("/transfer/Get")) 
    { 
     return true; // because someone is simply updating a client service reference 
    } 
    Console.WriteLine("Class Method Call: {0}",classMethod); 
    // do something with operationContext here as you need to inspect stuff 
    // return true if you want this class method call to succeed and go through 
    // return false if you want this class method to fail on the client 
    return true; 
    } 
} 

然后,在你的服务,你的host.Open()呼叫前右,将链接添加到MyServiceAuthorizationManager

ServiceHost host = new ServiceHost(typeof(MyProject.Service1)); 
host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager(); 
host.Open(); 

现在,当你测试你的客户端连接时,你会注意到控制台输出的是什么类的方法被调用。你也可以处理operationContext对象中的所有东西。

我使用这种方法是安全头检查。在我的客户端中,我添加了一个标题。然后,在这个服务中,在这个CheckAccessCore()调用中,我确认这个自定义头文件存在。如果不这样做,那么我将返回错误。这是保护黑客的又一层保护,对Named Pipes配置中的有限安全性也非常有用。如果您也想这样做,那么请拨打click here以获取有关如何添加自定义标头的更多信息,这些自定义标头可以在服务上的每个客户端的方法调用中自动发送。

注意,在这些之中,我没有必要混淆行为,声明,听众或消息发送。我也不需要编辑我的WCF配置。

注意上面的/transfer/Get的字符串检查。如果您将头部检查作为像我一样的安全机制,这非常重要。如果没有这样的条件,返回true,那么你的WCF客户端IDE不能更新其ServiceReference因为IDE不知道这些额外的标头(如果您要添加自定义标题,而不是指定在该头WCF客户端的app.config)。否则,您将收到错误The URI prefix is not recognized