Как отправить заголовок безопасности в службу WCF - PullRequest
0 голосов
/ 08 июня 2018

Привет! Я работаю над интеграцией со службой WCF. Я использую ссылку WSDL для генерации звонка в WCF.

Я всегда получаю сообщение Имя пользователя / пароль требуются вЗаголовок SOAP, но я не знаю, что я делаю неправильно.

Когда я сделал запрос через SOAPUI, работает отлично ..

Проблема в том, что метод получает два объекта.Первый - это обычная полезная нагрузка, а второй параметр имеет следующий тип:

public partial class SecurityHeaderType
{

    private System.Xml.Linq.XElement[] anyField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAnyElementAttribute(Order=0)]
    public System.Xml.Linq.XElement[] Any
    {
        get
        {
            return this.anyField;
        }
        set
        {
            this.anyField = value;
        }
    }
}

Я создаю конверт с помощью XElements:

XElement securityHeaderXml = new XElement(soapenv + "Envelope",
    new XAttribute(XNamespace.Xmlns + "soapenv", "http://schemas.xmlsoap.org/soap/envelope/"),
    new XAttribute(XNamespace.Xmlns + "oas", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"),
    new XAttribute(XNamespace.Xmlns + "ns", "http://www.opentravel.org/OTA/2003/05"),
    new XElement(soapenv + "Header",
    new XElement(oas + "Security",
      new XElement(oas + "UsernameToken",
        new XElement(oas + "Username", "someusername"),
        new XElement(oas + "Password", "somepassword",
          new XAttribute("Type",
            "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"))
      ))), new XElement(soapenv + "Body",
      new XElement(ns + "OTA_HotelAvailNotifRQ",
        new XAttribute("EchoToken", "abc123"),
        new XAttribute("Version", "1.0"),
        new XAttribute("ResStatus", "Commit"),
        new XAttribute("TimeStamp", DateTime.Now),
        new XElement("AvailStatusMessages", new XAttribute("HotelCode", hotelCode)
          , new XElement("AvailStatusMessage", new XAttribute("BookingLimit", 10),
            new XElement("StatusApplicationControl", new XAttribute("Start", DateTime.Now),
              new XAttribute("End", DateTime.Now.AddDays(4)),
              new XAttribute("InvTypeCode", "A1K"), new
                XAttribute("RatePlanCode", "GLD")
            ))))));

Если кто-то может мне помочь, я был бы признателенЭто!!

1 Ответ

0 голосов
/ 22 февраля 2019
public class SecurityHeader
{
   private SecurityHeaderType security;
   public SecurityHeaderType GetSecurityHeaderType(string username,string 
   password,string edmid)
   {
      security = new SecurityHeaderType();
      DateTime created = DateTime.Now;
      XmlDocument doc = new XmlDocument();
      using (XmlWriter writer = doc.CreateNavigator().AppendChild())
      {
         writer.WriteStartDocument();
         writer.WriteStartElement("oas",     
"Security",CMISNameSpaces.oasNamespace);
            writer.WriteStartElement("oas", "UsernameToken", 
CMISNameSpaces.oasNamespace);
            writer.WriteElementString("oas", "Username", 
CMISNameSpaces.oasNamespace, username);
            writer.WriteElementString("oas", "Password", 
CMISNameSpaces.oasNamespace, password);
            writer.WriteElementString("edm", "edmAppID", 
CMISNameSpaces.edmNamespace, edmid);

            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();
        }

        doc.DocumentElement.RemoveAllAttributes();
        System.Xml.XmlElement[] headers = 
doc.DocumentElement.ChildNodes.Cast<XmlElement>().ToArray<XmlElement>();

        security.Any = headers;

        return security;

    }

}
...