2014-12-05 3 views
0

Я создал веб-службы, которые хорошо работают, за исключением того, что я пытаюсь удалить пространства имен xsi и xsd.Удалите ненужные пространства имен xsi и xsd из wcf

Я видел много ссылок, показывающий, что я должен использовать пользовательский сериализатор, как это:

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
namespaces.Add(string.Empty, string.Empty); 

, но я не нашел способ реализовать это в моем коде. Вот мой код:

[ServiceContract, XmlSerializerFormat] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class MyUser 
{ 
    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "getUserInfo?token={userId}", BodyStyle = WebMessageBodyStyle.Bare)] 
    public PersonnResponse ValidateToken(string userId) 
    { 
     var response = new PersonnResponse(); 
     response.userId = userId; 
     response.firstName = myOtherServiceGetFirstName(userId); 
     response.lastName = myOtherServiceGetLastName(userId); 
     return response; 
    } 

[DataContract(Name = "person", Namespace = "")] 
public class PersonnResponse 
{ 
    [DataMember(Name = "userId", EmitDefaultValue = false)] 
    public string userId { get; set; } 

    [DataMember(Name = "firstName", EmitDefaultValue = false)] 
    public string firstName { get; set; } 

    [DataMember(Name = "lastName", EmitDefaultValue = false)] 
    public string lastName { get; set; } 
} 
+1

Почему вы хотите избавиться от этих пространств имен? –

+0

угадайте, что? клиент, который из другой компании им не нравится! –

+0

«Не нравится им»? Вы можете попросить у клиента тот же вопрос. Конечно, вам придется делать это в «клиентском разговоре». Например, скажите клиенту: «Мы будем работать, чтобы избавиться от пространств имен, так как вы считаете их неопрятными». Затем клиент может сказать: «О, да, это правильно» или «Нет, это не причина», у нас есть этот скрипт, который не может разобрать пространства имен ». –

ответ

1

Чтобы получить то, что вы ищете, вы должны реализовать IXmlSerializable:

[DataContract(Name = "person", Namespace = "")] 
public class PersonnResponse:IXmlSerializable 
{ 
    ... 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 


    public void ReadXml (XmlReader reader) 
    { 
     var xd = XDocument.Load(reader); 
     firstName = xd.Descendants().First (x => x.Name.LocalName == "firstName").Value; 
     lastName = xd.Descendants().First (x => x.Name.LocalName == "lastName").Value; 
     userId = xd.Descendants().First (x => x.Name.LocalName == "userId").Value; 
    } 

    public void WriteXml(XmlWriter writer){ 


     writer.WriteElementString("userId", userId); 
     writer.WriteElementString("firstName", firstName); 
     writer.WriteElementString("lastName", lastName); 

    } 
} 
public class Test 
{ 
    static void Main() 
    { 
     Test t = new Test(); 
     t.Serialize(); 
    } 

    private void Serialize() 
    { 
     // Create an instance of the class, and an 
     // instance of the XmlSerializer to serialize it. 
     var pers = new PersonnResponse(){ firstName="Call Me", lastName="Heisenberg", userId="Id"}; 
     XmlSerializer ser = new XmlSerializer(typeof(PersonnResponse)); 

     StringWriter tw = new StringWriter(); 
     ser.Serialize(tw,pers); 
     Console.WriteLine(tw.ToString()); 

     //Deserialize from XML string 
     var sw = new StringReader(tw.ToString()); 
     var NewPerson = ser.Deserialize(sw); 

    } 
} 

Вы будете в конечном итоге с XML, как это:

<?xml version="1.0" encoding="utf-16"?> 
<PersonnResponse> 
    <userId>Id</userId> 
    <firstName>Call Me</firstName> 
    <lastName>Heisenberg</lastName> 
</PersonnResponse> 
+0

Я мог понять суть. Я хочу знать, где именно я расскажу о своем проекте WCF, который сериализует этот документ и отправляет его обратно. –

Смежные вопросы