C# 检查您是否在wcf服务中

C# 检查您是否在wcf服务中,c#,asp.net,wcf,C#,Asp.net,Wcf,我使用WCF服务,不知道是否可以为调用方和服务使用OperationContract方法。 因此,我想知道判断代码是在应用程序中运行还是在服务中运行的最佳方法 像这样: [ServiceContract] public interface IService { [OperationContract] bool ServiceMethod(string param); } [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Sin

我使用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
      }
    }
  }
因为调用程序和服务都知道这个类,所以我认为如果两者都必须调用这个方法,并且它自己决定是否必须将调用转发给服务,或者只需执行即可工作,那么可能会更容易


谢谢大家!

您可以通过检查
OperationContext.Current
来检查您是否在WCF服务中,该WCF服务类与ASP.NET中的
HttpContext.Current
相当:

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

我不确定你的建议是不是一个好主意。是否希望根据调用方是否为WCF服务而有不同的行为?如果是这样的话,我建议创建两种方法来分离您的逻辑。拥有一个可能产生不同副作用的方法通常是一个糟糕的设计选择。好吧,通常该方法仍然做一件事,只要调用方不是wcf服务,该方法首先调用服务,然后再执行预期的工作。我的想法是,如果其他人只需使用自述名称调用这个方法,而不必查看哪个方法适合他,哪个方法适合服务,那么程序集将更容易为其他人使用。另一个想法是使这些类成为内部类,并对两个友好的程序集可见,其中一个是服务,另一个是应用程序的程序集。你怎么看?我同意@timothyclifford。但是您可以使用一些变通方法来识别方法的调用方。其中之一是添加自定义头,因此,如果来自WCF的任何客户端添加此头,都可以很容易地识别它。这个例子可以帮助你:听起来不是一个好的软件设计方法。您可以在客户端继承该类并重写您的方法,以首先添加所需的服务调用。如果(something){doone thing}或者{doone}是代码味道,则包含
的方法。很明显,这是在做两件不同的事情,所以要用两种方法。如果这两个方法之间的区别仅仅是一件事,那么就这样做,然后调用一个通用的第三个方法来完成其余的工作。如果您通过并等待了一个
,那么当前的
就会流动。ConfgureAwait(false)
前面的代码?@ScottChamberlain:我真的不知道。在异步/等待时代之前使用它。有一些通用代码,所以保存了一些“会话信息”。全部同步。