Ответ 1
Если вы возвращаете сериализуемый объект, WebAPI будет автоматически отправлять JSON или XML на основе заголовка Accept, который отправляет ваш клиент.
Если вы вернете строку, вы получите строку.
Я хочу, чтобы мой метод 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;
}
Немного взломан, потому что я все еще на стадии прототипирования. Будет ли рефакторинг, когда я смогу доказать его выполнимость.
Если вы возвращаете сериализуемый объект, WebAPI будет автоматически отправлять JSON или XML на основе заголовка Accept, который отправляет ваш клиент.
Если вы вернете строку, вы получите строку.
Если вы не хотите, чтобы контроллер определял тип возвращаемого объекта, вы должны установить тип возвращаемого метода как 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.
Здесь другой способ быть совместимым с типом возврата 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
})
});
Вы должны просто вернуть свой объект и не должны беспокоиться о его 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.