1

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

我的例子:我想建立一个可以通过 暂停的服务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()
    {
        /* ... */
    }
}
4

3 回答 3

5

我相信您正在寻找的内容可以在以下位置找到:

OperationContext.Current.IncomingMessageHeaders.Action

这将暴露被调用的操作。这是你需要的吗?

于 2013-01-23T08:28:15.290 回答
2

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

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

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

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

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

    ...

    [OperationContract]
    public void DoWork()
    {
        this.CheckPauseStatusAndExecuteIfTrue(() =>
        {
            //// write your method behavior
        });
    }
    
于 2013-01-23T08:15:10.897 回答
0

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

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

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

于 2013-01-23T08:22:53.123 回答