Добавление пользовательского пространства имен в конверт для мыла в WCF - PullRequest
2 голосов
/ 01 марта 2012

Я звоню в службу, которой необходимо добавить определенное пространство имен в мыльный конверт.

например, вот мой пример обычного мыльного сообщения

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:sec="ANOTHER NAMESPACE THAT I WANT TO ADD" >
      <s:Header>

     </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xyz xmlns="">
   <customerId>2511</customerId>
  </xyz>
   </s:Body>
   </s:Envelope>

Я уже внедряю IDispatchMessageInspector, IClientMessageInspector для какой-то другой цели, я не уверен, что мне нужно что-то там делать, чтобы добавить дополнительное пространство имен.

Ответы [ 2 ]

1 голос
/ 10 апреля 2016

Вы можете добавить пространства имен как часть пользовательской реализации 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-конверт

0 голосов
/ 11 октября 2012

Если вы сгенерировали свой код с помощью svcutil или добавив внешнюю ссылку, вы можете сделать следующее:

[System.ServiceModel.ServiceContractAttribute(Namespace = "ANOTHER NAMESPACE THAT I WANT TO ADD", Name = "sec")]
public partial class TheClassYouAreUsingForAClient {  }

Это должно позволить вам добавить пространство имен без изменения сгенерированного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...