Вы можете добавить пространства имен как часть пользовательской реализации Message
, которая включает в себя метод OnWriteStartEnvelope()
, который можно переопределить и добавить любые пользовательские пространства имен.Затем вы подключаете Сообщение к MessageFormatter
и затем используете MessageFormatAttribute
для привязки поведения к определенным методам.
Ключевой метод, который добавляет пространства имен, находится в переопределенной реализации Message
, где вы можетедобавьте пространства имен в конверт:
protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
{
writer.WriteStartElement("soapenv", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
writer.WriteAttributeString("xmlns", "oas", null, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
writer.WriteAttributeString("xmlns", "v2", null, "http://www.royalmailgroup.com/api/ship/V2");
writer.WriteAttributeString("xmlns", "v1", null, "http://www.royalmailgroup.com/integration/core/V1");
writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");
}
После прикрепления к конверту остальная часть документа будет затем повторно использовать эти объявленные пространства имен верхнего уровня, а не встроенные пространства имен.
Я написал блогпост, описывающий полный процесс, который включает в себя реализации Message
, MessageFormatter
и FormatMessageAttribute
: http://weblog.west -wind.com / posts / 2016 / Apr / 02 / Custom-Message-Formatting-in-WCF-к надстройке все-Namespaces-к-SOAP-конверт