2013-01-23 86 views
1

有没有可能在构造函数中识别我的服务的哪个方法被调用?WCF服务 - 了解构造函数中调用哪个方法

我的例子: 我想建立一个服务,可以通过SetPauseService(true)暂停,这样他暂停时不会做任何工作。我不想检查每个方法中的暂停标志,所以我试图将它存档在构造函数中。 我的问题是,用户必须在服务暂停时再拨打SetPauseService(false)以再次激活服务。

[ServiceContract] 
public class MyService 
{ 

    private static bool isPaused; 

    public MyService() 
    { 
     if (/*<Pseudo>*/ InvokedMethod != "SetPauseService" /*</Pseudo>*/) 
     { 
      if (isPaused) 
      { 
       throw new Exception("Cannot be executed, service is paused!"); 
      } 
     } 
    } 

    [OperationContract] 
    public void SetPauseService(bool status) 
    { 
     isPaused = status; 
    } 

    [OperationContract] 
    public void DoWork() 
    { 
     /* ... */ 
    } 
} 

回答

5

我相信你在找什么可以发现:

OperationContext.Current.IncomingMessageHeaders.Action 

这将会使所谓的操作。 这是你需要的吗?

+0

这就是我一直在寻找的。谢谢! –

+0

我的荣幸:P tho @daryal似乎也指出了实施的一个好方向。无论如何高兴地帮助。 – JanivZ

2

我认为在这种情况下有三种选择;

  1. 编写WCF实例行为以检查服务是否已暂停。 我假设WCF服务的实例上下文模式不是每次调用(例如,您没有为每个调用创建一个新的服务实例)。然后,你可以实现一个实例行为来返回你的服务类的实例,为什么实现你将有权访问请求。您可以检查被调用的方法,并可能处理该响应或仅放弃该请求。也许你可以使用其他行为类型来实现这一点;可能会有更合适的(你可以在这里查看http://msdn.microsoft.com/en-us/magazine/cc163302.aspx)。

  2. 在您的方法中使用属性来检查服务是否暂停。您可以在调用方法之前使用PostSharp并注入代码。您可以在方法调用之前检查暂停状态并决定是否执行。请参阅postsharp

  3. 在某些操作中封装方法代码以检查服务是否已暂停。您可以编写一个接受Action s作为参数的通用函数;防爆。

    public void CheckPauseStatusAndExecuteIfTrue(Action action) 
    { 
        if (!this.isPaused) 
        { 
         action(); 
        } 
    } 
    

    ...

    [OperationContract] 
    public void DoWork() 
    { 
        this.CheckPauseStatusAndExecuteIfTrue(() => 
        { 
         //// write your method behavior 
        }); 
    } 
    
0

如果它确实存在,它可能在OperationContext.Current。我只是不会依赖于此:该建筑由WCF控制。如果您尝试,请确保您使用'PerCall'模式。

更好的方法是实现自定义参数检查器。 (实现IParameterInspector并将其绑定到行为中)您可以使用方法对象BeforeCall(字符串操作名,对象[]输入)来完成这项工作。

无论采用哪种方式,我都会反对'暂停'服务,因为连接会从客户端堆积起来。简单地停止服务主机,处理客户端中的“暂停”并在完成工作后再次启动它可能会更好。

相关问题