2015-07-13 99 views
3

我使用WCF服务,并想知道我是否可以为调用者和服务使用OperationContract方法。 因此,我想知道如果代码在应用程序或服务中运行的最佳方式。检查你是否在wcf服务

像这样:

[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 
     } 
    } 
    } 

由于调用程序和服务都知道这个类,我认为,如果双方只需要调用这个方法可能更容易,并决定自己是否有转发致电该服务,或者只是可以工作。

谢谢!

+2

我不知道你建议是好想法。你需要不同的行为,具体取决于调用者是否是WCF服务?如果是这样,我会建议创建两种方法来分离你的逻辑。有一种可能有不同副作用的方法通常是不好的设计选择。 – timothyclifford

+0

好吧,通常该方法仍然有一件事,就是如果调用者不是wcf服务,该方法首先调用服务,然后进行预期的工作。 我的想法背后是,如果他只需要用自己的名字称呼这一个方法,而不必看看哪个是他的,哪个是服务的,那么该组合对于其他人更容易使用。 另一个想法是使这些类内部和两个友好的程序集可见,其中一个是服务,另一个是应用程序的程序集。你对此有何看法? – Michael

+0

我同意@timothyclifford。 但是,您可以使用一些变通方法来识别您的方法的调用者。 其中之一是添加一个自定义标题,所以如果任何来自WCF的客户添加这个标题,它可以很容易地识别。 这个例子可以帮助你:http://stackoverflow.com/a/3277754 –

回答

2

您可以检查,如果你是一个WCF服务中通过检查OperationContext.Current,这是一个WCF服务类媲美HttpContext.Current在ASP.NET:

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

如果您已经在代码中的'.ConfgureAwait(false)'前面传递并等待了'OperationContext.Current',那么是否'OperationContext.Current'流动? –

+0

@ScottChamberlain:我真的不知道。在异步/等待时代之前使用它。有一些共同的代码可以节省一些'会话信息'。全部同步。 –