Как вернуть XML в веб-службе RESTful .NET WCF? - PullRequest
1 голос
/ 24 марта 2011

Я установил веб-службу WCF в Visual Web Developer 2010 Express с использованием 4.0 Framework и преобразовал ее в службу RESTful с помощью этого учебного пособия

Я смог изменить ее на свойнравится принимать параметры URL, например, так:

namespace RestServicePublishing
{
[ServiceContract]
public interface IRestService
{
    [OperationContract(Name="GetXML")]
    [WebGet(UriTemplate = "/{param1}/{param2}")]
    XmlDocument GetXML(string param1, string param2);
}
}

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю сообщение об ошибке "Тип 'System.Xml.XmlDocument' нельзя сериализовать" при попытке вернуть документ XML, напримерэто:

namespace RestServicePublishing
{
public class RestService : IRestService
    {

    public  XmlDocument GetXML(string param1, string param2)
    {

        //I am not using the parameters currently, I would just like to see if 
        //i can return XML first with this simple example:

        StringBuilder sb = new StringBuilder();
        System.Xml.XmlWriter writer = XmlWriter.Create(sb);
        writer.WriteStartDocument(); 
        writer.WriteStartElement("People");
        writer.WriteStartElement("Person"); 
        writer.WriteAttributeString("Name", "Nick"); 
        writer.WriteEndElement(); 
        writer.WriteStartElement("Person"); 
        writer.WriteStartAttribute("Name"); 
        writer.WriteValue("Nick"); 
        writer.WriteEndAttribute(); 
        writer.WriteEndElement();
        writer.WriteEndElement(); 
        writer.WriteEndDocument(); 
        writer.Flush();

        XmlDocument xmlDocument = new Xml.XmlDocument(); 
        xmlDocument.LoadXml(sb.ToString());
        return xmlDocument; 
    }

}
}

Я знаю, что должен быть лучший способ настроить XML-документ и вернуть его .. Любая помощь очень ценится!

Заранее спасибо !!

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

Да - хорошо ... модель для WCF говорит, что вы не должны пытаться вернуть сам XmlDocument. Вместо этого вы возвращаете пользовательский тип , определенный в вашей среде программирования. Этот тип должен быть размечен, чтобы указать, как он должен быть сериализован в XML. Затем, когда этот метод возвращает пользовательский тип, WCF неявно сериализует его в документ XML.

Я думаю, что вы хотите вернуть что-то вроде этого:

<People>
  <Person Name="Nick"/>
  <Person Name="Bonnie"/>
</People>

Но DataContractSerializer не любит выдавать атрибуты. Таким образом, используя WCF обычным способом для создания веб-служб XML, вы получите что-то вроде этого:

<People>
  <Person><Name>Nick</Name></Person>
  <Person><Name>Bonnie</Name></Person>
</People>

Для этого напишите свой код C # следующим образом:

namespace RestServicePublishing
{
    [ServiceContract]
    public interface IRestService
    {
        [OperationContract(Name="GetXML")]
        [WebGet(UriTemplate = "/{param1}/{param2}")]
        List<Person> GetXML(string param1, string param2);
    }
}

Тогда тип должен выглядеть следующим образом:

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }
}

[CollectionDataContract(Name = "People")]
public class People : List<Person>
{
}
2 голосов
/ 24 марта 2011

Верните его как строку, а затем загрузите эту строку в XmlDocument на другом конце.

Есть ли проблема с отправкой XML через WCF?

Или предпочтительно , создайте класс DataContract, который имитирует структуру XML в коде, и затем WCF превратит его в XML для вас.

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