是否有可能在构造函数中识别出我的服务的哪个方法被调用?
我的例子:
我想构建一个可以通过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()
{
/* ... */
}
}
答案 0 :(得分:5)
我相信您所寻找的内容可以在以下网址找到:
OperationContext.Current.IncomingMessageHeaders.Action
这将公开被调用的操作。 这是你需要的吗?
答案 1 :(得分:2)
我认为在这种情况下有三种选择;
编写WCF实例行为以检查服务是否已暂停。 我假设WCF服务的实例上下文模式不是每次调用(例如,您没有为每个调用创建新的服务实例)。然后,您可以实现实例行为以返回服务类的实例,以及为什么实现您将有权访问该请求。您可以检查调用的方法,并可以处理响应或仅丢弃请求。也许您可以使用其他行为类型来实现这一点;可能有更合适的(你可以在这里查看http://msdn.microsoft.com/en-us/magazine/cc163302.aspx)。
在方法中使用属性来检查服务是否已暂停。您可以使用PostSharp并在调用方法之前注入代码。您可以在方法调用之前检查暂停状态,并决定是否执行。请参阅postsharp
在某些操作中封装方法代码以检查服务是否已暂停。您可以编写一个接受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'并在完成工作后再次启动它。