【问题标题】:Check if your are in wcf service检查您是否在 wcf 服务中
【发布时间】:2015-07-13 12:04:07
【问题描述】:

我使用 WCF 服务,想知道是否可以为调用者和服务使用 OperationContract 方法。 因此,我想知道说明代码是在应用程序中运行还是在服务中运行的最佳方式。

像这样:

[ServiceContract]
public interface IService
{
    [OperationContract]
    bool ServiceMethod(string param);
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,
InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext=false)]
public class Service : IService
{
    bool ServiceMethod(string param)
    {
      if(!isInWcfService) //How to do this?
      {
        //Call this ServiceMethod in WCF Service
      }
      else
      {
        //Do the work
      }
    }
  }

由于调用程序和服务都知道这个类,我认为如果两者都只需要调用这一个方法并且它自己决定是否必须将调用转发给服务或只是可以工作可能会更容易。

谢谢!

【问题讨论】:

  • 我不确定你的提议是不是一个好主意。根据调用者是否是 WCF 服务,您是否需要不同的行为?如果是这样,我建议创建两种分离逻辑的方法。拥有一种可以产生不同副作用的方法通常是一个糟糕的设计选择。
  • 好吧,一般来说该方法还是做一件事,只是如果调用者不是wcf服务,该方法首先调用该服务然后执行预期的工作。我背后的想法是,如果他只需要使用自说名称调用这个方法,而不必查找哪个适合他,哪个适合服务,那么该程序集将更容易为其他人使用。另一个想法是使这些类在两个友好程序集内部和可见,其中一个是服务,另一个是应用程序的程序集。你怎么看?
  • 我同意@timothyclifford 的观点。但是您可以使用一些变通方法来识别您的方法的调用者。其中之一是添加自定义标头,因此如果来自 WCF 的任何客户端添加此标头,则可以轻松识别它。这个例子可以帮助你:stackoverflow.com/a/3277754
  • 听起来不是一个好的软件设计方法。您可以在客户端继承该类并覆盖您的方法以首先添加所需的服务服务调用。
  • 包含if (something) { do one thing } else { do another } 的方法是代码异味。它显然在做两件不同的事情,所以让它成为两种方法。如果这两种方法之间的区别只是一件事,那么就这样做,然后调用一个通用的第三种方法来完成其余的工作。

标签: c# asp.net wcf


【解决方案1】:

您可以通过检查OperationContext.Current 来检查您是否在 WCF 服务中,这是一个类似于 ASP.NET 中 HttpContext.Current 的 WCF 服务类:

if (OperationContext.Current != null)
{
    // inside WCF
}
else
{
    // not
}

【讨论】:

  • 如果您在代码前面的 .ConfgureAwait(false) 上通过并等待,OperationContext.Current 是否流动?
  • @ScottChamberlain:我真的不知道。在 async/await 时代之前使用它。有一些通用代码可以保存一些“会话信息”。全部同步。
猜你喜欢
  • 2010-11-03
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多