WCF服务 - 了解构造函数中调用的方法

时间:2013-01-23 08:09:52

标签: c# 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()
    {
        /* ... */
    }
}

3 个答案:

答案 0 :(得分:5)

我相信您所寻找的内容可以在以下网址找到:

OperationContext.Current.IncomingMessageHeaders.Action

这将公开被调用的操作。 这是你需要的吗?

答案 1 :(得分:2)

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

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

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

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

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

    ...

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

答案 2 :(得分:0)

如果它存在,它可能在OperationContext.Current中。我只是不依赖于此:构造由WCF控制。如果您尝试,请确保使用“PerCall”模式。

更好的方法是实现自定义参数检查器。 (实现IParameterInspector并将其绑定到行为中)您可以使用方法对象BeforeCall(string operationName,object [] inputs)来完成工作。

无论哪种方式,我都会反对'暂停'服务,因为连接会从客户端堆积起来。最好简单地停止servicehost,在客户端处理'pause'并在完成工作后再次启动它。