Сериализация параметра - указать пространство имен - PullRequest
0 голосов
/ 23 января 2019

У меня есть сервер WCF, у которого есть вызов, имеющий 2 параметра, но для каждого параметра требуется другое пространство имен. Я не могу указать пространство имен для параметров.

Итак, вызов, который отправляется на сервер (который я не могу адаптировать):

<ns1:myWCFCall
  xmlns:ns1="testNameSpace1"
  >
  <ns1:firstParam>
     <ns1:a></ns1:a>
     <ns1:b></ns1:b>
  </ns1:firstParam>
  <ns2:secondParam
    xmlns:ns2="testNameSpace2">
     <ns2:a></ns2:a>
     <ns2:a></ns2:a>
  </ns2:secondParam>
</ns1:myWCFCall>

Я создал интерфейс + реализация. Мне нужно использовать XMLSerialization из-за некоторых других ограничений стандартного сериализатора. Задание XMLElement на уровне параметров (включая пространство имен), похоже, не работает вообще.

    [ServiceContract(Namespace = "testNameSpace1")]
    [XmlSerializerFormat]
    public interface ITestService
    {
        [OperationContract]
        myResponseObject myWCFCall(
            [XmlElement(Namespace = "testNameSpace1")] myObject firstParam, 
            [XmlElement(Namespace = "testNameSpace2")] myOtherObject secondParam);
    }

//Implementation
    public class Service1 : IService1
    {

        public myResponseObject myWCFCall(
            [XmlElement(Namespace = "testNameSpace1")] myObject firstParam, 
            [XmlElement(Namespace = "testNameSpace2")] myOtherObject secondParam)
        {
            return new myResponseObject();
        }
     }

//Sample classes
    [Serializable]
    public class myObject
    {
        [XmlElement]
        public string a;
        [XmlElement]
        public string b;
    }

//tried putting this in another C# namespace, no difference in the results.
    [Serializable]
    public class myOtherObject
    {
        [XmlElement]
        public string a;
        [XmlElement]
        public string b;
    }


Добавление [XmlRoot (Namespace = "testNameSpace2")] не работает для первого уровня. Только для последующих уровней (a, b)

Так что я продолжаю получать неправильный результат, когда проверяю WSDL ... (ns1: secondParam вместо ns2: secondParam):

<ns1:myWCFCall
  xmlns:ns1="testNameSpace1"
  >
  <ns1:firstParam>
     <ns1:a></ns1:a>
     <ns1:b></ns1:b>
  </ns1:firstParam>
  <ns1:secondParam
    xmlns:ns2="testNameSpace2">
     <ns2:a></ns2:a>
     <ns2:a></ns2:a>
  </ns1:secondParam>
</ns1:myWCFCall>

Справка.

1 Ответ

0 голосов
/ 24 января 2019

Единственный способ, которым я мог придумать, - это использовать MessageContract, который мог бы контролировать пространство имен параметра на корневом уровне. XmlRoot по какой-то причине не смог изменить корневой элемент вашего параметра, перейдите по ссылке ниже

Почему атрибут XmlRoot игнорируется в WCF и как преодолеть это

Но в вашем случае у вас есть два параметра, но messagecontract может иметь только один параметр. Поэтому я предлагаю вам использовать контракт следующим образом.

public class TheFirst
{
    [MessageBodyMember]
    public string AOfTheFirst { get; set; }
    [MessageBodyMember]
    public string BOfTheFirst { get; set; }

}

public class TheSecond
{
    [MessageBodyMember]
    public string AOfTheFirst { get; set; }
    [MessageBodyMember]
    public string BOfTheFirst { get; set; }

}

[MessageContract(IsWrapped = false)]  //IsWrapped= "false" removes the OuterClasselement in the request element
public class OuterClass{
    [MessageBodyMember(Namespace ="www.thefirst.com",Name ="aliasForFirst")]
    public TheFirst TheFirst { get; set; }
    [MessageBodyMember(Namespace ="www.thesecond.com",Name ="aliasForSecond")]
    public TheSecond TheSecond { get; set; }




}

MyContract.

  [ServiceContract]

public interface IXmlSerService
{
    [OperationContract]

    OuterClass wcfCll(OuterClass outerClass);
}

MyService

 public  class XmlSerService:IXmlSerService
{



    public OuterClass wcfCll(OuterClass outerClass)
    {

        return new OuterClass { TheFirst = new TheFirst { AOfTheFirst = "a", BOfTheFirst = "b" },TheSecond = new TheSecond { AOfTheFirst = "a", BOfTheFirst = "b" } };
    }


}

Результат. enter image description here

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