2016-04-17 149 views
7

我有一個字符串是XML,我需要將它作爲XML文檔返回。默認情況下,返回的內容類型爲text/plain。內容呈現,但我需要的內容類型爲application/xml。我已經啓用了選項RespectBrowserAcceptHeader,它將把對象序列化爲XML並設置正確的內容類型,除非對象是字符串。返回「application/xml」而不是「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

您使用的是什麼版本的ASP.NET Core? –

+1

' 「SDK」:{ 「版本」: 「1.0.0-RC1-UPDATE2」, 「運行」: 「coreclr」, 「架構」: 「64」 }'' – Daric

+1

將ContentResult'爲工作太。 –

回答

9

你可以做return Content(xmlString, "application/xml")但是這可能不會做到這一點的最好辦法,除非它們被存儲在這種方式上的文件系統或數據庫。

通常情況下,您希望擁有強大的類型類,您可以從操作中返回並將它們序列化爲xml。

您還可以告訴您的操作根據accept頭(即,json或xml)返回內容,但對於xml,您需要先註冊xml序列化程序第一個iirc。

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

和標註你的行動

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

    return ObjectResult(user); 
} 

如果客戶端發送Accept: application/xml那麼它將返回XML,如果客戶端發送Accept: application/json返回JSON。

+0

「通常你會希望擁有強大的類型類,你可以從你的動作中返回並將它們序列化爲xml。」 - 是的,這個工作,但這個問題的上下文是關係到[本文](http://stackoverflow.com/questions/36670596/manually-creating-an-odata-feed-in-asp-net-芯使用-饋入功率-BI)。我需要附加比對象中包含的數據更多的數據。 – Daric

+0

第一行是做我所需要的。謝謝! – Daric

+0

當談到.NET Core的時候,有很多過時的答案和解決方案,這使得它花費時間來獲得答案。然而,這個答案對於最新的ASP.NET Core(1.1)是正確的。 –

12

簡答

如果你有一個字符串,它是XML,並且需要將其返回爲一個XML文檔,然後返回一個ContentResult

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

全部實施例

控制器

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

啓動

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": {} 
    } 
} 

響應

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的好辦法。 :)

+0

指出我在正確的方向,謝謝! – Daric

+0

@Daric什麼原來爲你工作? –

+1

'[HttpGet,Produces(「application/xml」)] public ContentResult Get() {012;}} '(抱歉糟糕的格式化) – Daric

相關問題