2013-09-09 2 views
0

У меня есть класс, который я сериализацияКласса сериализация и пространство имен (XMLNS)

public partial class Security : MessageHeader 
{ 
    private Assertion assertionField; 

    [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:oasis:names:tc:SAML:2.0:assertion")] 
    public Assertion Assertion 
    { 
     get 
     { 
      return this.assertionField; 
     } 
     set 
     { 
      this.assertionField = value; 
     } 
    } 

    public override string Name 
    { 
     get { return "Security"; } 
    } 

    public override string Namespace 
    { 
     get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; } 
    } 

    [XmlIgnoreAttribute] 
    public string UserID { get; set; } 

    [XmlIgnoreAttribute] 
    public string FirstName { get; set; } 

    [XmlIgnoreAttribute] 
    public string LastName { get; set; } 

    [XmlIgnoreAttribute] 
    public string ReasonForSearch { get; set; } 

    public Security() 
    { 
     Assertion = new Assertion(UserID, FirstName, LastName, ReasonForSearch); 
    } 

    protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("saml", "urn:oasis:names:tc:SAML:2.0:assertion"); 
     XmlSerializer serializer = new XmlSerializer(typeof(Assertion)); 
     serializer.Serialize(writer, Assertion, ns); 
    } 
} 

это, как я добавляю код заголовок

using (OperationContextScope scope = new OperationContextScope(healthixClient.InnerChannel)) 
     { 
      Security msgHdr = new Security(); 
      msgHdr.UserID = "TestUserID"; 
      msgHdr.FirstName = "TestUserFirstName"; 
      msgHdr.LastName = "TestUserLastName"; 
      msgHdr.ReasonForSearch = "ReasonForSearch"; 

      OperationContext.Current.OutgoingMessageHeaders.Add(msgHdr); 
     } 

когда я сериализую и добавить в моем заголовке коды это выглядит как этот

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <saml:Assertion ID="saml_6691a2b1-2a08-4d10-9d90-b006727d0e02" IssueInstant="2013-09-09T15:38:16Z" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> 
< rest of the Xml is correct > 

Теперь, если я только изменить способ переопределения OnWriteHeaderContents к

protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("saml", "urn:oasis:names:tc:SAML:2.0:assertion"); 
     XmlSerializer serializer = new XmlSerializer(typeof(Security)); 
     serializer.Serialize(writer, new Security(), ns); 
    } 

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

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
    <Security xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> 
     <saml:Assertion ID="saml_6691a2b1-2a08-4d10-9d90-b006727d0e02" IssueInstant="2013-09-09T15:29:09Z" Version="2.0"> 
     < rest of the Xml is correct > 

Что я хочу заголовок выглядеть это

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> 
    <saml:Assertion ID="saml_6691a2b1-2a08-4d10-9d90-b006727d0e02" IssueInstant="2013-07-29T20:17:30.846Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> 
+0

Я s должно быть интересно иметь несколько пространств имен, объявленных на одном и том же элементе http://stackoverflow.com/a/945246/1236044 (возможно, OnWriteStartHeader - лучшее место) – jbl

+0

, что не помогает. Моя проблема заключается в добавлении моего сериализованного объекта в заголовок сообщения. – DotNetBeginner

+0

Пожалуйста, покажите нам один из элементов, которые вы говорите «остальные правильные». Это скажет нам, что вы подразумеваете под «правильным». –

ответ

0

Попробуйте эту опцию в OnWriteHeaderContents метод

writer.WriteStartElement("saml", "Assertion", "urn:oasis:names:tc:SAML:2.0:assertion"); 
writer.WriteString("Value"); 
writer.WriteEndElement();