Как добавить пользовательские заголовки мыла в wcf?
Могу ли я добавить настраиваемый заголовок SOAP во входящие / исходящие сообщения WCF в basicHttpBinding, как мы можем добавить настраиваемый заголовок аутентификации в веб-службах ASMX? Эти настраиваемые заголовки SOAP должны быть доступны с помощью клиентов веб-службы.net 2.0/1.1 (доступно с помощью инструмента WSDL.EXE) .
2 ответа
Ознакомьтесь с дополнениями WCF в Codeplex - это простая библиотека расширений для WCF, которая предлагает, помимо прочего, настраиваемые заголовки SOAP.
Другой вариант заключается в использовании контрактов сообщений WCF в вашей службе WCF - это также позволяет легко определять и устанавливать заголовки WCF SOAP.
[MessageContract]
public class BankingTransaction
{
[MessageHeader]
public Operation operation;
[MessageHeader]
public DateTime transactionDate;
[MessageBodyMember]
private Account sourceAccount;
[MessageBodyMember]
private Account targetAccount;
[MessageBodyMember]
public int amount;
}
Здесь "операция" и "транзакция-дата" определяются как заголовки SOAP.
Если ни один из этих методов не поможет, вам следует проверить концепцию инспекторов сообщений WCF, которую вы можете написать как расширение. Они позволяют, например, вставлять определенные заголовки в сообщение при каждом исходящем вызове на клиенте и извлекать их из сообщения на сервере для вашего использования.
См. Этот пост в блоге Обработка пользовательских заголовков SOAP с помощью поведения WCF, чтобы узнать, как написать инспектор сообщений и как включить его в настройку проекта.
Клиентская сторона IClientMessageInspector
определяет два метода BeforeSendRequest
а также AfterReceiveReply
в то время как на стороне сервера IDispatchMessageInspector
имеет противоположные методы, т.е. AfterReceiveRequest
а также BeforeSendReply
,
При этом вы можете добавлять заголовки к каждому сообщению, проходящему по сети (или выборочно только для нескольких).
Вот фрагмент из IClientMessageInspector
Разработчик, который мы используем для автоматической передачи языковой информации (информация о языке и культуре) от клиентов к серверу, должен дать вам представление о том, как начать:
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
International intlHeader = new International();
intlHeader.Locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
MessageHeader header = MessageHeader.CreateHeader(WSI18N.ElementNames.International, WSI18N.NamespaceURI, intlHeader);
request.Headers.Add(header);
return null;
}
На стороне сервера вы должны проверить наличие этих заголовков и, если они есть, извлечь их из конверта SOAP и использовать их.
ОБНОВЛЕНИЕ: хорошо, вы клиенты на.NET 2.0 и не используете WCF - хорошая новость заключается в том, что это все равно должно работать просто отлично - подробности см. В этом сообщении в блоге. Пользовательские заголовки SOAP: WCF и ASMX. Вы все еще можете использовать инспектор сообщений на стороне сервера, чтобы прослушивать и извлекать пользовательские заголовки, отправляемые вашими клиентами.NET 2.0.
Это решение было проще для меня:
var client = "Your Service Client";
using (var scope = new OperationContextScope(client.InnerChannel))
{
System.Xml.XmlDocument document = new XmlDocument();
XmlElement element = document.CreateElement("wsse", "UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
XmlElement newChild = null;
newChild = document.CreateElement("wsse", "Username", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
newChild.InnerText = "finance";
element.AppendChild(newChild);
newChild = document.CreateElement("wsse", "CorporationCode", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
newChild.InnerText = "387";
element.AppendChild(newChild);
MessageHeader messageHeader = MessageHeader.CreateHeader("UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", element, false);
OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
var result = client.GetCorporations(new CorporationType { pageNo = 1 });
}