Как вызвать службу WCF, для которой требуются заголовки от Silverlight - PullRequest
1 голос
/ 21 декабря 2010

Службы WCF 3.5 с пакетом обновления 1 (SP1) / Вызывается из Silverlight 4

В ситуации, когда поставщик создал API-интерфейс WCF, как службы svc, так и пользовательский прокси-клиент.

Оба аспектаэтого API сидят поверх основной четырехслойной абстракции.

Сначала существуют два абстрактных класса MessageContract: WcfRequest и WcfResponse.

Абстрактный тип WcfRequest содержит свойства, украшенные атрибутом MessageHeader, и содержит такие вещи, как настраиваемый идентификатор аутентификации и часовой пояс.

Затем существует второй слой лука, где каждый метод разделенна два класса: GetSomethingRequest и GetSomethingResponse, оба из которых наследуются от WcfRequest и WcfReponse, соответственно.

Далее идет уровень реализации, где типы, основанные на WcfRequest и WcfResponse, всплывают и вызываются пользовательским типом WcfClient,который контролирует всю конструкцию ChannelFactory, устанавливает привязку и, самое главное, устанавливает заголовок идентификатора в типе WcfRequest на основе ранее установленного значения в памяти (например, ключа сеанса).

Наконец, выводится представлениеВ другом мире, где вы запрашиваете типы POCO через значения id.

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

Если вы сделали это далеко, спасибо, что остались со мной.

Теперь проблема возникает, когда я хочу написать клиент Silverlight, используя либо «Добавить ссылку на службу», либо SLSvcUtil.ни один из сгенерированных типов прокси-клиентов не имеет этих свойств заголовка из заголовка WcfRequest для установки и не определяется в прототипе сообщения как параметры для передачи.

Чтобы установить эти заголовки, я посмотрел наWCFExtras проект на Codeplex и пытался использовать подпрограммы ClientSoapHeaderHelper, но это не работает для Silverlight (без возможности расширения).

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

Вы человек, который знает, как вручную (взломать) эти заголовки на место?

Спасибо за любыепомощь ... но полностью понимаю, если это не получит хитов.

1 Ответ

1 голос
/ 21 декабря 2010

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

Вот как я справился с этим (три класса).

Внутри операционного контекста я создаю новый экземпляр моего класса HeaderSerializer. Этот класс основан на HeaderSerializerBase (мой класс тоже), который основан на XmlObjectSerializer. HeaderSerializerBase использует WriteRaw для записи любой строки в заголовок, который вам нравится (в моем случае он был сохранен в приложении, но вы можете создать его динамически без проблем).

HTH:)

using (OperationContextScope ocs = new OperationContextScope(client.InnerChannel))
            {

                var ser = new HeaderSerializer();
                OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("SecurityHeader",
                                                                                               "http://somesite.com/schema",
                                                                                               authHeader, ser));                

                var req = new GetPredefinedSearchResultsRequest()
                              {
                                  Someproperty = somevalue
                              };

                client.GetPredefinedSearchResultsAsync(req);
            }




            public class HeaderSerializer : HeaderSerializerBase
            {
                public EPGHeaderSerializer()
                {
                    base.autheHeaderString = XamlingCore.Infrastructure.Resource.ResourceLoader.LoadStringResource("Assembly.Data", "RawHeaderData.txt");
                }
            }




            public class HeaderSerializerBase : XmlObjectSerializer
            {
                protected string autheHeaderString;

                public override void WriteStartObject(XmlDictionaryWriter writer, object graph)
                {
                    throw new NotImplementedException();
                }

                public override void WriteObjectContent(XmlDictionaryWriter writer, object graph)
                {
                    writer.WriteRaw(autheHeaderString.ToCharArray(), 0, autheHeaderString.Length);
                }

                public override void WriteEndObject(XmlDictionaryWriter writer)
                {
                    throw new NotImplementedException();
                }

                public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName)
                {
                    throw new NotImplementedException();
                }

                public override bool IsStartObject(XmlDictionaryReader reader)
                {
                    throw new NotImplementedException();
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...