2010-01-18 2 views
1

Я использую wcf 4 и пытаюсь прозрачно передавать контекстную информацию между клиентом и сервером.wcf - передать контекст в заголовки

Я смотрел на поведение и смог пройти мимо. Моя проблема заключается в том, как передать контекст, полученный во входящих заголовках, другим службам, которые могут быть вызваны службой.

В служебном поведении я перехватываю сообщение и читаю заголовки, но не знаю, где разместить эти данные для следующего вызова службы, который может выполнить текущая служба.

То, что я ищу что-то вроде:

public void DoWork() 
{ 
    var someId = MyContext.SomeId; 
    //do something with it here and call another service 
    using(var proxy = GetProxy<IAnotherService>()) 
      proxy.CallSomeOtherMethodThatShouldGetAccessTo_ MyContextualObject(); 

} 

Если хранить заголовки в потоке локального хранилища я мог бы иметь проблемы из-за нитку маневренности (не уверен, что это происходит за пределами ASP.NET, ака таможенной службы хосты). Как бы вы реализовали код MyContext в приведенном выше коде.

Я выбрал MyContext вместо прямого доступа к заголовкам, потому что инициатором вызова службы может быть не служба, в этом случае MyContext поддерживается HttpContext, например, для хранения.

ответ

0

В поведении службы перехватывать на сообщение и прочитать заголовки , но не знает, куда поместить эти данные быть доступными для следующего обслуживания вызова.

Как правило, у вас нет какого-либо состояния между звонками. Каждый вызов полностью автономный, каждый вызов получает новый экземпляр класса обслуживания, созданного с нуля. Это рекомендуемая передовая практика.

Если вам нужно передать эту информацию (язык, настройки, что бы то ни было) на второй, третий, четвертый вызов, сделайте это, передав ее в своих заголовках. Do не начать ставить состояние на сервер WCF! Услуги WCF всегда должны быть полностью автономными и не сохранять любое состояние, если это возможно.

UPDATE: хорошо, после того, как ваши комментарии: что может представлять интерес для вас новый RoutingService базовый класс, который будет поставляться с WCF 4. Это позволяет сценарии, как вы описываете - получаю сообщение об ошибке с внешней стороны и пересылки это к другой службе где-то в фоновом режиме. Google для «WCF4 RoutingService» - вы должны найти ряд статей. Я не мог найти привязки к конкретным заголовкам, но я думаю, что они будут прозрачно транспортироваться.

Существует также статья из двух частей Building a WCF Router Part 1part 2 here) в журнале MSDN, которая более или менее аналогична в WCF 3.5 - опять же, не уверена в заголовках, но, возможно, это может дать вам идею.

+0

Извините, я не сделал это ясно. Я говорил о звонках, которые служба будет предоставлять другим службам. Мне нужно передать информатину. Как бы вы это сделали, не заглядывая в заголовки в методе обслуживания (иначе известный код). –

+0

Использование OperationContextScope также бесполезно. –

+0

Я не думаю, что есть какой-то другой способ, чем считывать заголовки comnig с первого вызова и вставлять их обратно в заголовок второго исходящего вызова. –

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