2015-07-13 9 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

Выполняет ли 'OperationContext.Current' поток, если вы прошли и ожидали в' .ConfgureAwait (false) 'ранее в коде? –

+0

@ScottChamberlain: Я действительно не знаю. Использовал его до эры async/await. Имел некоторый общий код, который так сохранил некоторую «информацию о сеансе». Все синхронно. –

Смежные вопросы