У меня есть служба WCF, которая размещена в службе Windows. Клиенты, которые используют эту службу, должны передавать идентификатор каждый раз, когда они вызывают методы службы (потому что этот идентификатор важен для того, что должен делать вызываемый метод). Я подумал, что это хорошая идея - как-то поместить этот идентификатор в информацию заголовка WCF.
Если это хорошая идея, как я могу автоматически добавить идентификатор к информации заголовка. Другими словами, всякий раз, когда пользователь вызывает метод WCF, идентификатор должен автоматически добавляться в заголовок.
ОБНОВЛЕНИЕ: Клиенты, которые используют службу WCF, являются приложениями Windows и Windows Mobile (используя Compact Framework).
Ответы:
Преимущество этого заключается в том, что он применяется к каждому вызову.
Создайте класс, который реализует IClientMessageInspector . В методе BeforeSendRequest добавьте свой пользовательский заголовок к исходящему сообщению. Это может выглядеть примерно так:
Затем создайте поведение конечной точки, которое применяет инспектор сообщений к среде выполнения клиента. Вы можете применить поведение через атрибут или через конфигурацию, используя элемент расширения поведения.
Вот отличный пример того, как добавить заголовок агента пользователя HTTP ко всем сообщениям запроса. Я использую это в некоторых из моих клиентов. Вы также можете сделать то же самое на стороне службы, реализовав IDispatchMessageInspector .
Это то, что вы имели в виду?
Обновление: я нашел этот список функций WCF, которые поддерживаются компактной структурой. Я считаю , что сообщение инспекторов классифицируемых как «Channel расширяемость» , который, согласно этому сообщению, которые поддерживаются в компактной структуре.
источник
OutgoingMessageProperties
- это то, что вам нужно для доступа к заголовкам HTTP, а не кOutgoingMessageHeaders
заголовкам SOAP.Вы добавляете это к звонку используя:
И затем, на стороне сервера вы берете его, используя:
источник
OperationContextScope
(иOperationContext
) ответThreadStatic
- Марк Гуд будет работать, не полагаясь наThreadStatic
элементы.Если вы просто хотите добавить один и тот же заголовок ко всем запросам к сервису, вы можете сделать это без любой кодировки!
Просто добавьте узел заголовков с необходимыми заголовками под узлом конечной точки в файле конфигурации клиента
источник
MessageHeader
), а не заголовки HTTP.Вот еще одно полезное решение для ручного добавления пользовательских заголовков HTTP в ваш клиентский запрос WCF с использованием в
ChannelFactory
качестве прокси. Это должно быть сделано для каждого запроса, но достаточно просто для демонстрации, если вам просто нужно выполнить юнит-тестирование вашего прокси при подготовке к платформам, отличным от .NET.источник
Это похоже на ответ NimsDotNet, но показывает, как это сделать программно.
Просто добавьте заголовок к привязке
источник
источник
Это то, что сработало для меня, адаптировано от добавления заголовков HTTP к вызовам WCF
После объявления этих классов вы можете добавить новое поведение к вашему клиенту WCF следующим образом:
источник
Это работает для меня
источник
Контекстные привязки в .NET 3.5 могут быть именно тем, что вы ищете. Есть три из коробки: BasicHttpContextBinding, NetTcpContextBinding и WSHttpContextBinding. Протокол контекста в основном передает пары ключ-значение в заголовок сообщения. Ознакомьтесь со статьей « Управление состоянием с помощью Durable Services» в журнале MSDN.
источник
Если я правильно понимаю ваше требование, простой ответ: вы не можете.
Это связано с тем, что клиент службы WCF может быть создан любой третьей стороной, которая использует ваш сервис.
ЕСЛИ у вас есть контроль над клиентами вашего сервиса, вы можете создать базовый класс клиента, который добавляет желаемый заголовок и наследует поведение рабочих классов.
источник
Вы можете указать пользовательские заголовки в MessageContract .
Вы также можете использовать заголовки <endpoint> , которые хранятся в файле конфигурации и будут скопированы в заголовок всех сообщений, отправленных клиентом / службой. Это полезно, чтобы легко добавить статический заголовок.
источник
MessageHeader
), а не заголовки HTTP.Если вы хотите добавить пользовательские заголовки HTTP к каждому вызову WCF объектно-ориентированным способом, не смотрите дальше.
Как и в ответе Марка Гуда и Пола, нам нужно создать подкласс
IClientMessageInspector
для вставки пользовательских заголовков HTTP в запрос WCF. Однако давайте сделаем инспектор более общим, приняв словарь, содержащий заголовки, которые мы хотим добавить:Как и в ответе Марка Гуда и Пола, нам нужно создать подкласс,
IEndpointBehavior
чтобы внедритьHttpHeaderMessageInspector
наш клиент в WCF.Последняя часть, необходимая для завершения нашего объектно-ориентированного подхода, заключается в создании подкласса нашего автоматически сгенерированного клиента WCF (для создания клиента WCF я использовал справочное руководство по веб-сервисам WCF от Microsoft ).
В моем случае мне нужно прикрепить ключ API к
x-api-key
заголовку HTML.Подкласс делает следующее:
EndpointConfiguration
сгенерировано перечисление для передачи в конструктор - возможно, ваша реализация не будет иметь этого)AddHttpHeaderMessageEndpointBehavior
кEndpoint
поведению клиентаНаконец, используйте ваш клиент!
Полученный HTTP-запрос должен содержать ваши HTTP-заголовки и выглядеть примерно так:
источник
Немного опоздал на вечеринку, но Юваль Лоуи рассматривает этот точный сценарий в своей книге и связанной библиотеке ServiceModelEx .
В основном он определяет специализации ClientBase и ChannelFactory, которые позволяют указывать типобезопасные значения заголовков. Я предлагаю загрузить исходный код и посмотреть на классы HeaderClientBase и HeaderChannelFactory.
Джон
источник