2012-07-26 35 views
31

Estoy queriendo que mi método WEB API devuelva un objeto XML a la aplicación llamante. Actualmente solo devuelve el XML como un objeto de cadena. ¿Es esto un no, no? Si es así, ¿cómo le dices al método webapi get que está devolviendo un objeto de tipo XML?WebAPI para devolver XML

Gracias

Editar: un ejemplo del método 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;   
} 

Es un poco hacky porque estoy todavía en la fase de prototipo. Se refactorizará cuando pueda demostrar que es factible.

Respuesta

28

Si devuelve un objeto serializable, WebAPI enviará automáticamente JSON o XML en función del encabezado Aceptar que envía su cliente.

Si devuelve una cadena, obtendrá una cadena.

+0

Hola a todos, Los datos que devuelve el método son dinámicos. La situación A. está devolviendo una lista de entidades. La situación B. podría ser una lista de combinación de 2 o más entidades/clases. Espero tenerlo dinámico pero engañar a los webapi para que devuelvan xml (si también puede devolver el formato JSON de lo que sería genial, pero XML es la necesidad principal) – Matt

+0

Luego crea un objeto de algún tipo que pueda contener los datos que deseas y devuelve ese. –

+2

Asegúrese de especificar [Serializable()] en el objeto, me olvidé de este inicialmente. –

14

Simplemente debe devolver su objeto, y no debe preocuparse si es XML o JSON. Es responsabilidad del cliente solicitar JSON o XML desde la API web. Por ejemplo, si realiza una llamada utilizando Internet Explorer, el formato predeterminado solicitado será Json y la API web devolverá Json. Pero si realiza la solicitud a través de google chrome, el formato de solicitud predeterminado es XML y obtendrá XML de nuevo.

Si realiza una solicitud utilizando Fiddler, puede especificar que el encabezado Aceptar sea Json o XML.

Accept: application/xml 

Puede Quiero ver este artículo: Content Negotiation in ASP.NET MVC4 Web API Beta – Part 1

EDIT: en base a su pregunta editada con código:

lista retorno simple de la cadena, en lugar de convertir a XML. Pruébalo usando 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; 
    } 

Por ejemplo si su lista es como:

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

y especifica Accept: application/xml la salida será:

<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> 

y si se especifica 'Accept: application/json' en la solicitud entonces la salida será:

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

Deje que el cliente solicite el tipo de contenido, en lugar de enviar el xml personalizado.

+0

Así que actualmente estoy construyendo la costumbre del XML en la API obtiene el método simplemente como una cadena concatenada y luego devuelve esa cadena. ¿Entonces no se debe hacer nada más después de eso? – Matt

+0

lea el comentario adjunto a la publicación de voltagex – Matt

+0

@ Raven, ¿podría publicar la firma de su método o parte del código C relacionado en su pregunta? – Habib

62

Si no desea que el controlador decida el tipo de objeto de retorno, debe establecer el tipo de retorno de método como System.Net.Http.HttpResponseMessage y usar el código siguiente para devolver el 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") 
    }; 
} 

Esta es la forma más rápida de devolver siempre XML desde la API web.

+9

Con demasiada frecuencia la gente responde que es inteligente. Quiero que las respuestas sean simples y aborden directamente el problema en cuestión. Tengo una cadena con XML. Quiero devolver XML. ¡BINGO! Gracias por esta respuesta. – Kevin

18

Aquí hay otra manera de ser compatible con un tipo de devolución IHttpActionResult.En este caso, yo estoy pidiendo que use el serializador XML (opcional) en lugar de serializador Contrato de datos, estoy usando return ResponseMessage( de modo que consiga un retorno compatible con IHttpActionResult:

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

Así es exactamente lo que estaba buscando. Gracias AaronLS – Shahdat

+1

Gran respuesta, gracias. Asegúrate de que 'SomeType' tenga un constructor predeterminado, o si obtienes un error inútil *" ... el formateador configurado 'System.Web.Http.Tracing.Tracers.XmlMediaTypeFormatterTracer' no puede escribir un objeto de tipo ... "* – Dunc

+2

Puedes simplemente escriba 'Content (System.Net.HttpStatusCode.OK, model, Configuration.Formatters.XmlFormatter)'. – kokosda