SoapFormatter - как включить пространства имен? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть блокиратор, который я не могу решить. Проблема в автоматически сгенерированном запросе SOAP, созданном классом SoapFormatter. Я пытаюсь связаться с сервисом WCF и передать некоторые данные. Я реализовал класс, который я пытаюсь сериализовать в запрос на мыло.

[Serializable]
public class MySoapClass: ISerializable
{        
    public string Username{ get; set; }
    public string Password{ get; set; }
    public int Data3 { get; set; }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.FullTypeName = "ThisIsNameIWantInSoap";
        info.AddValue("Username", Username);
        info.AddValue("Password", Password);
        info.AddValue("Data3", Data3);
    }
}

Я использую объекты MemoryStream и MySoapClass в SoapFormatter. Я получаю мыльную ленту таким образом Encoding.UTF8.GetString(stream.GetBuffer(), 0, (int)stream.Position)

Сгенерированная строка мыла не работает, запрос доставлен, но я получаю «ошибку аутентификации», так же как служба WCF не смогла извлечь какие-либо данные из запроса. Это автоматически созданная мыльная строка:

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <a1:ThisIsNameIWantInSoap id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/assem/http://tempuri.org/">
      <Username id="ref-1">username</Username>
      <Password id="ref-2">password</Password>
      <Data3>10</Data3>
    </a1:ThisIsNameIWantInSoap>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

После копирования строки мыла в SoapUI и добавления тега пространства имен к каждому параметру все работает нормально. Я получаю правильный ответ от службы WCF.

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <a1:ThisIsNameIWantInSoap id="ref-1" xmlns:a1="http://tempuri.org/">
      <a1:Username id="ref-1">username</a1:Username>
      <a1:Password id="ref-2">password</a1:Password>
      <a1:Data3>10</a1:Data3>
    </a1:ThisIsNameIWantInSoap>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Мои вопросы:

-Как автоматически сгенерировать мыльную строку, которая включает в себя тег пространства имен «a1:» в каждом параметре?

- (Отвечено) Как изменить пространство имен «a1:» на «SomeElse:»?

...