Включение другого пространства имен в конверт SOAP в клиент WCF - PullRequest
0 голосов
/ 12 ноября 2011

Я подключаюсь к сервису Soap1.1.Это уже существующий сервис, использующий определение интерфейса промышленного стандарта (названное MultiSpeak, чрезвычайно распространенное в служебном пространстве)

Стандарты MultiSpeak не содержат положений для передачи CustomerID, который требуется этому поставщику, поэтому онинемного изменил SoapEvenelope.Моя проблема в том, что я не могу понять, как убедить WCF выдавать правильный XML.

Мой текущий конверт выглядит следующим образом:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:MultiSpeakMsgHeader UserID="****" Pwd="****" Company="****"
      xmlns="http://www.multispeak.org/Version_3.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:h="http://www.multispeak.org/Version_3.0" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GetAMRSupportedMeters xmlns="http://www.multispeak.org/Version_3.0" />
  </s:Body>
</s:Envelope>

Вот как мне нужно, чтобы он выглядел, чтобы работать:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:MultiSpeakMsgHeader UserID="****" Pwd="****" Company="****"
      vendor:CustomerID="StringValue"
      xmlns="http://www.multispeak.org/Version_3.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:h="http://www.multispeak.org/Version_3.0" 
      xmlns:vendor="http://www.MyVendor.com/Multispeak3"/>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GetAMRSupportedMeters xmlns="http://www.multispeak.org/Version_3.0" />
  </s:Body>

Итак, введено новое пространство имен (пользовательское пространство имен моего поставщика) и в существующий объект «MultiSpeakMsgHeader» введено новое свойство, называемое «CustomerID», но атрибут в XML, который представляет это свойствонаходится в другом NameSpace

WSDL, с которым они мне предоставили работать (стандартный MultiSPeak WSDL), не генерирует это.

Я полагаю, что достаточно легко добавить «CustomerID» как строковое свойство к объекту MultiSpeakMsgHeader в reference.cs, но он не будет генерироваться с надлежащим оформлением xmlns и, следовательно, не будет работать (да,Я проверял это ... без пространства имен, без любви).

Я в растерянности.Я пытался настроить их WSDL и регенерировать, чтобы он заработал, но безуспешно.

Любые намеки, и я, безусловно, буду благодарен.Я уже слишком много времени потратил на эту проблему.

Спасибо всем.

1 Ответ

1 голос
/ 14 ноября 2011

Вы можете попробовать создать свой собственный мыльный заголовок. Пример кода приведен ниже:

using (OperationContextScope scope = new OperationContextScope(objService.InnerChannel))

        {
            UsernameToken objUsernameToken = new UsernameToken() { Username = "rajesh", Password = "rajesh" };
            List<Type> obj = new List<Type>();
            obj.Add(typeof(UsernameToken));

            //XmlObjectSerializer ser = new DataContractSerializer(typeof(Security), "Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", obj);

            XmlObjectSerializer ser = new CustomXmlSerializer(typeof(Security), "Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

            Security security = new Security();
            security.UsernameToken = objUsernameToken;

            MessageHeader header = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
                                                              security, ser, false);

            OperationContext.Current.OutgoingMessageHeaders.Add(header);

            try
            {   
                //Would get a exception but the response was successful. You can see that in fiddler. 
                //The cause for the exception is that the response has the security elements mustUnderstand set to 1 chagning that to 0 would resolve the problem. Need to find on how to do that
                string response = objService.GetInformation();
            }
            catch (Exception ex)
            {
                OperationContext.Current.IncomingMessageHeaders.RemoveAll("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");   
                //throw;
            }

        } 

Надеюсь, вы сможете изменить приведенный выше код в соответствии с вашими требованиями.

...