Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При вызове службы, отличной от WCF, с помощью клиента WCF иногда необходимо использовать пользовательские заголовки SOAP. Существует ошибка канонизации в WCF, которая мешает подписанным и зашифрованным пользовательским заголовкам работать с сервисом, отличным от WCF. Проблема вызвана неправильной канонизацией пространств имен XML по умолчанию. Это проблематично только при вызове служб, отличных от WCF, с пользовательскими заголовками, подписанными и (или) зашифрованными. Когда служба получает сообщение, содержащее подписанный и /или зашифрованный пользовательский заголовок, он не может проверить подпись. Это решение позволяет избежать ошибки канонизации, позволяет взаимодействовать со службами, отличными от WCF, но не предотвращает взаимодействие со службами WCF.
Определение пользовательского заголовка
Пользовательские заголовки определяются путем определения контракта сообщения и маркировки элементов, которые вы хотите отправить в качестве заголовков атрибутом MessageHeaderAttribute . Чтобы обойти ошибку канонизации, необходимо убедиться, что сериализатор XML объявляет пространство имен для пользовательского заголовка с префиксом вместо объявления пространства имен по умолчанию. В следующем коде показано, как определить тип данных, который будет использоваться в качестве заголовка сообщения с правильным объявлением пространства имен.
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.648")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.example.org/getMessage/")]
public partial class msgHeaderElement
{
// Define the XML namespace and force it to use an ‘h’ prefix
[System.Xml.Serialization.XmlNamespaceDeclarations]
public System.Xml.Serialization.XmlSerializerNamespaces _xsns = new System.Xml.Serialization.XmlSerializerNamespaces(new System.Xml.XmlQualifiedName[] { new System.Xml.XmlQualifiedName("h", "http://www.example.org/getMessage/") });
private string msgHeaderInputField;
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
public string msgHeaderInput
{
get
{
return this.msgHeaderInputField;
}
set
{
this.msgHeaderInputField = value;
}
}
}
Этот код объявляет новый тип msgHeaderElement
, который будет сериализован с помощью XML-сериализатора. При сериализации экземпляра этого типа он определит пространство имен с префиксом 'h', чтобы обойти ошибку канонизации. Затем контракт сообщения определяет экземпляр msgHeaderElement
и помечает его атрибутом MessageHeaderAttribute , как показано в следующем примере.
[MessageContract]
public class MyMessageContract
{
// other message contents...
[MessageHeader(ProductionLevel=ProtectionLevel.EncryptAndSign)]
public msgHeaderElement;
// other message contents...
}