передать пользовательское значение в контексте WCF между IDispatchMessageInspector.AfterReceiveRequest и IClientMessageInspector.BeforeSendRequest - PullRequest
0 голосов
/ 28 марта 2011

У меня есть приложение ASP, которое является клиентом WCF SERVICE1, которое является клиентом WCF SERVICE2.

Я добавил IDispatchMessageInspector и IClientMessageInspector в WCF SERVICE1.

Теперь мне нужно передатьПользовательское значение от ASP до WCF1, затем до WCF2.

от ASP до WCF1 - тривиально, через заголовки сообщений.

Вопрос в том, как передать пользовательское значение из IDispatchMessageInspector.AfterReceiveRequest (запрос от ASP, полученный WCF1) в IClientMessageInspector.BeforeSendRequest (подготовить к отправке запроса в WCF2) операции WCF SERVICE 1?

Есть ли какой-то контекст, который можно использовать?

Ответы [ 2 ]

1 голос
/ 02 декабря 2016

В моем случае мне пришлось идентифицировать и регистрировать вложенные сервисные вызовы, запрошенные клиентом.Для этого я помечаю каждый вызов службы свойством ThreadStatic и добавляю это свойство в заголовок клиентского вызова (service1 считается клиентом для service2), чем в методе AfterReceiveRequest, который я проверял на его наличие.Если существует, текущий метод был запрошен родительским сервисом.

  public class GenericMessageInspector : IDispatchMessageInspector, IClientMessageInspector
    {
        [ThreadStatic]
        private static string _masterServiceGUID;


        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
        {
            if (request.Headers.Action == null)
                return null;


            //Control request header for nested call
            string masterRequestId = string.Empty;
            var IsMasterExist = request.Headers.FindHeader("MasterServiceGUID", "namespace");

            if (IsMasterExist > -1)
            {
                //requested by internal service
                masterRequestId = request.Headers.GetReaderAtHeader(IsMasterExist).ReadInnerXml();
            }

        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            if (!String.IsNullOrEmpty(_masterServiceGUID))
            {
                request.Headers.Add(MessageHeader.CreateHeader("MasterServiceGUID", "namespace", _masterServiceGUID));
            }
            return null;
        }
    }
}
1 голос
/ 29 марта 2011

Как выглядит ваш код? Если предположить, что первым отправляет запрос к WCF2 инспектор диспетчера сообщений, то достаточно просто использовать свойства сообщения.

Однако, если ваш инспектор отправляет сообщения что-то делает; затем запрос продолжает обработку, и именно реализация службы на самом деле вызывает WCF2, тогда вам нужно будет перепрыгнуть еще несколько обручей. В общем, я бы сказал, что вам понадобится инспектор, чтобы поместить некоторые данные в свойства сообщения запроса службы, которые реализация service должна будет подобрать и скопировать в сообщение для отправки в WCF2, чтобы инспектор клиента может забрать их.

Это уродливо, и это сделало бы весь процесс более хрупким.

Не могли бы вы подробнее рассказать, что вы пытаетесь сделать? Какие данные вы собираетесь передать таким образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...