web-dev-qa-db-ja.com

「text / plain」の代わりに「application / xml」を返すASP.NETCore Web API

XMLの文字列があり、XMLドキュメントとして返す必要があります。デフォルトでは、これはtext/plainのコンテンツタイプで返されます。コンテンツはレンダリングされますが、コンテンツタイプはapplication/xmlである必要があります。オプションRespectBrowserAcceptHeaderを有効にしました。これにより、オブジェクトが文字列の場合を除いて、オブジェクトがXMLとしてシリアル化され、正しいコンテンツタイプが設定されます。

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

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

return Content(xmlString, "application/xml")を実行することもできますが、ファイルシステムまたはDBにこのように保存されていない限り、これはおそらく最善の方法ではありません。

通常、アクションから返される強い型のクラスが必要であり、それらを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が返されます。

20
Tseng

短い答え

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>

ここではGitHubにあります 適切な測定のために。 :)

21
Shaun Luttin