2016-04-17 17 views
7

Mam ciąg znaków, który jest XML i muszę go zwrócić jako dokument XML. Domyślnie jest zwracana z typem zawartości text/plain. Treść jest renderowana, ale potrzebuję typu zawartości, aby być application/xml. Włączyłem opcję RespectBrowserAcceptHeader, która serializuje obiekty jako XML i ustawia poprawny typ zawartości, z wyjątkiem sytuacji, gdy obiekt jest łańcuchem.Powrót "application/xml" zamiast "text/plain" ASP.NET Core Web API

[HttpGet] 
public string Get() 
{ 
    return xmlString; 
} 

public static string xmlString = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
        <sample> 
         Hello World. 
        </sample>"; 
+1

Jakiej wersji ASP.NET Core używasz? –

+1

' "SDK": { "wersja": "1.0.0-RC1-Update2" "czas pracy": "coreclr" "architektura": "64" }' 'ContentResult' – Daric

+1

zadziała za to także. –

Odpowiedz

9

Można zrobić return Content(xmlString, "application/xml") ale nie jest to chyba najlepszy sposób, aby to zrobić, chyba że są one przechowywane w ten sposób w systemie plików lub DB.

Zwykle chciałbyś mieć silne klaski maszynowe, które powróciłeś ze swoich działań i zmodyfikujesz je jako xml.

Możesz również powiedzieć czynności, aby zwrócić zawartość na podstawie nagłówka accept (tj. Json lub xml), ale w przypadku xml musisz najpierw zarejestrować serializatory xml.

services.AddMvc(...) 
     .AddXmlSerializerFormatters() 
     .AddXmlDataContractSerializerFormatters(); 

i opisywania działań

Produces("application/json", "application/xml")] 
public Task<IActionResult> Get() 
{ 
    User user = ...; 

    return ObjectResult(user); 
} 

Jeśli klient wysyła Accept: application/xml następnie powróci xml i jeśli klient wysyła Accept: application/json zwraca JSON.

+0

"Zwykle chciałbyś mieć silne klaski maszynowe, które powróciłeś ze swoich działań i zmodyfikuje je jako xml." - Tak, i to działa, ale kontekst tego pytania jest związany z [tym wpisem] (http://stackoverflow.com/questions/36670596/manually-creating-an-odata-feed-in-asp-net- core-using-feed-in-power-bi). Potrzebuję dołączyć więcej danych niż to, co jest zawarte w obiekcie. – Daric

+0

Pierwsza linia robi to, czego potrzebowałem. Dzięki! – Daric

+0

Jeśli chodzi o .NET Core, istnieje wiele nieaktualnych odpowiedzi i tuturialów, które sprawiają, że czasochłonne uzyskiwanie odpowiedzi. Ta odpowiedź jest jednak POPRAWNA dla najnowszego Core ASP.NET (1.1). –

12

Krótka odpowiedź

Jeśli masz ciąg znaków, który jest XML i trzeba zwrócić go w postaci dokumentu XML, a następnie powrócić do ContentResult.

[HttpGet] 
public ContentResult Get() 
{ 
    return new ContentResult 
    { 
     ContentType = "application/xml", 
     Content = xmlString, 
     StatusCode = 200 
    }; 
} 

Pełna Przykład

Kontroler

using Microsoft.AspNetCore.Mvc; 

namespace MyXmlSample 
{ 
    [Route("xml")] 
    public class MyXmlController 
    { 
     public static string xmlString = 

@"<?xml version=""1.0"" encoding=""UTF-8""?> 
<sample> 
    Hello World. 
</sample>"; 

     [HttpGet] 
     public ContentResult Get() 
     { 
      return new ContentResult 
      { 
       ContentType = "application/xml", 
       Content = xmlString, 
       StatusCode = 200 
      }; 
     } 
    } 
} 

Uruchomienie

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.DependencyInjection; 

namespace MyXmlSample 
{ 
    public class Program 
    { 
     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMvcCore();  
     } 

     public void Configure(IApplicationBuilder app) 
     { 
      app.UseMvc(); 
     } 

     public static void Main(string[] args) 
     { 
      var host = new WebHostBuilder() 
       .UseKestrel() 
       .UseStartup<Program>() 
       .Build(); 

      host.Run(); 
     } 
    } 
} 

project.json

{ 
    "version": "1.0.0-*", 
    "compilationOptions": { 
    "emitEntryPoint": true 
    }, 
    "dependencies": { 
    "Microsoft.AspNetCore.Mvc.Core": "1.0.0-*", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-*", 
    "Microsoft.NETCore.App": "1.0.0-rc2-*" 
    }, 
    "frameworks": { 
    "netcoreapp1.0": { 
     "imports": [ 
     "dnxcore50", 
     "portable-net45" 
     ] 
    } 
    }, 
    "runtimes": { 
    "win10-x64": {} 
    } 
} 

Response

HTTP/1.1 200 OK 
Date: Sun, 17 Apr 2016 22:10:45 GMT 
Content-Type: application/xml 
Server: Kestrel 
Content-Length: 75 

<?xml version="1.0" encoding="UTF-8"?> 
<sample> 
    Hello World. 
</sample> 

Here it is on GitHub na dokładkę. :)

+0

Wskazał mi w dobrym kierunku, dziękuję! – Daric

+0

@Daric Co się sprawdziło dla Ciebie? –

+1

'[HttpGet, Produces (" application/xml ")] public ContentResult Get() { return Content (xmlString," application/xml "); } '(przepraszam za okropne formatowanie) – Daric