Подтвердить что ты не робот

WebAPI для возврата XML

Я хочу, чтобы мой метод WEB API возвращал объект XML обратно вызывающему приложению. В настоящее время он просто возвращает XML как строковый объект. Разве это нет? Если да, то как вы скажете метод webapi get, что он возвращает объект типа XML?

Спасибо

Изменить: пример метода Get:

[AcceptVerbs("GET")]
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName)
{
   List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData
            ("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
   string AllResults = "";
   for (int i = 0; i < SQLResult.Count - 1; i++)
   {
       AllResults += SQLResult[i];
   }
    string sSyncData = "<?xml version=\"1.0\"?> " + AllResults;
    HttpResponseMessage response = new HttpResponseMessage();
    response.Content = new StringContent(sSyncData);
    return response;          
}

Немного взломан, потому что я все еще на стадии прототипирования. Будет ли рефакторинг, когда я смогу доказать его выполнимость.

4b9b3361

Ответ 1

Если вы возвращаете сериализуемый объект, WebAPI будет автоматически отправлять JSON или XML на основе заголовка Accept, который отправляет ваш клиент.

Если вы вернете строку, вы получите строку.

Ответ 2

Если вы не хотите, чтобы контроллер определял тип возвращаемого объекта, вы должны установить тип возвращаемого метода как System.Net.Http.HttpResponseMessage и использовать приведенный ниже код для возврата XML.

public HttpResponseMessage Authenticate()
{
  //process the request 
  .........

  string XML="<note><body>Message content</body></note>";
  return new HttpResponseMessage() 
  { 
    Content = new StringContent(XML, Encoding.UTF8, "application/xml") 
  };
}

Это самый быстрый способ всегда возвращать XML из веб-API.

Ответ 3

Здесь другой способ быть совместимым с типом возврата IHttpActionResult. В этом случае я прошу использовать XML-сериализатор (необязательно) вместо Serializer Data Contract, я использую return ResponseMessage(, чтобы получить обратную совместимость с IHttpActionResult:

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new ObjectContent<SomeType>(objectToSerialize, 
              new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
                  UseXmlSerializer = true 
              })
       });

Ответ 4

Вы должны просто вернуть свой объект и не должны беспокоиться о его XML или JSON. Ответственность клиента - запрашивать JSON или XML из веб-api. Например, если вы выполняете вызов с помощью Internet Explorer, тогда запрошенный формат по умолчанию будет Json, и веб-API вернет Json. Но если вы сделаете запрос через google chrome, формат запроса по умолчанию - XML, и вы получите XML обратно.

Если вы сделаете запрос, используя Fiddler, вы можете указать заголовок Accept как Json или XML.

Accept: application/xml

Вы можете увидеть эту статью: Консолидация контента в бета-версии веб-API ASP.NET MVC4 - часть 1

EDIT: на основе вашего отредактированного вопроса с кодом:

Простой возвращаемый список строки вместо преобразования в XML. попробуйте его с помощью Fiddler.

public List<string> Get(int tenantID, string dataType, string ActionName)
    {
       List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
       return SQLResult;
     }

Например, если ваш список похож:

List<string> list = new List<string>();
list.Add("Test1");
list.Add("Test2");
list.Add("Test3");
return list;

и вы указываете Accept: application/xml, вывод будет:

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <string>Test1</string>
  <string>Test2</string>
  <string>Test3</string>
</ArrayOfstring>

и если вы укажете "Принять: приложение /json " в запросе, то вывод будет:

[
  "Test1",
  "Test2",
  "Test3"
]

Таким образом, пусть клиент запрашивает тип контента, а не отправляет настроенный xml.