web-dev-qa-db-ja.com

ASP.Net Core Web APIコントローラーがXMLを返さないのはなぜですか?

次の単純なWeb APIコントローラーがあります。

    // GET: api/customers
    [HttpGet]
    public async Task<IActionResult> Get()
        {
        var customers = await uow.Users.GetAllAsync();
        var dto = customers.Select(p => new CustomerDto {Id = p.Id, Email = p.Email, UserName = p.UserName});
        return Ok(dto); // IEnumerable<CustomerDto>
        }

Postmanでは、Acceptヘッダーをapplication/xmlに設定していますが、何を試しても、返されるのはJSONデータだけです。

Postman screen shot

XMLを取得するために、[DataContract]および[DataMember]属性をDTOに追加する必要があることをどこかで読んだところ、次のようになります。

[DataContract]
public class CustomerDto
    {
    [DataMember]
    public string Id { get; set; }

    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    [DataMember]
    public string Email { get; set; }

    [Required]
    [Display(Name = "Login Name")]
    [DataMember]
    public string UserName { get; set; }
    }

私はそれを今数時間行っていますが、なぜそれが機能しないのか分かりません。私はもう試した:

  • アクションメソッドを同期および非同期にする
  • データを直接返し、戻り値の型をIEnumerable<CustomerDto>に設定する
  • コレクションをリストではなく配列に変換する
  • IActionResultを返す
  • コレクションの代わりに単一のアイテムを返す
  • Acceptヘッダーがデバッガーで調べて、リクエストに表示されていることを確認しました。
  • たくさんの「Bingによるグーグル」とさまざまなブログの閲覧
  • テンプレートから新しいWebAPIプロジェクトを作成し、そこにインスピレーションがあるかどうかを確認します(実際にはそうではありません)。

    シンプルだと思いますが、見えません...

18
Tim Long

XMLフォーマッターは、別のパッケージの一部です:Microsoft.AspNetCore.Mvc.Formatters.Xml

上記のパッケージを追加し、startup.csを以下のように更新します。

services
    .AddMvc()
    .AddXmlDataContractSerializerFormatters();

OR

services
    .AddMvc()
    .AddXmlSerializerFormatters();
22
Kiran Challa

Asp.Net Core 2.xの場合、基本的に次の3つのものが必要ですreturn XML応答:

Startup.cs:

services
    .AddMvcCore(options => options.OutputFormatters.Add(new XmlSerializerOutputFormatter())

CustomerController.cs:

using Microsoft.AspNetCore.Mvc;

namespace WebApplication
{
    [Route("api/[controller]")]
    public class CustomerController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            var customer = new CustomerDto {Id = 1, Name = "John", Age = 45};
            return Ok(customer);
        }
    }
}

CustomerDto.cs:

namespace WebApplication
{
    public class CustomerDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

そして、Accept "application/xml"ヘッダーをリクエストに追加すると、XML形式の結果が返されます。

非常に重要な注意私が自分で確認する必要があったことは、モデルに明示的なパラメーターのない暗黙のコンストラクターがない場合、応答はjsonとして書き込まれます。次の例を考える

namespace WebApplication
{
    public class CustomerDto
    {
        public CustomerDto(int id, string name, int age)
        {
            Id = id;
            Name = name;
            Age = age;
        }

         public int Id { get; }
         public string Name { get; }
         public int Age { get; }
    }
}

jsonを返します。このモデルに追加する必要があります

public CustomerDto()
{
}

そして、再び[〜#〜] xml [〜#〜]を返します。

16
Roolingen

asp.net core 2.xの場合、OutputFormatterを構成できます。

startup.csクラスのConfigureServicesメソッドで次のコードを試すことができます。

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc(action =>
     {
         action.ReturnHttpNotAcceptable = true;
         action.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
     });

     //...
}

XmlDataContractSerializerOutputFormatterを使用する場合は、nugetからのMicrosoft.AspNetCore.Mvc.Formattersパッケージからの参照。

これで、xmlおよびjsonで機能するはずです

6
arslanaybars

MVC 1.1の場合、パッケージを追加する必要がありますMicrosoft.AspNetCore.Mvc.Formatters.Xmlを編集してStartup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => { options.RespectBrowserAcceptHeader = true; })
        .AddXmlSerializerFormatters()
        .AddXmlDataContractSeria‌​lizerFormatters();
}

これでAcceptヘッダーを設定できます。

XML:application/xml

JSON:application/json

3
darkend

Core 2.xバージョンの場合、行う必要があるのはConfigureServieメソッドStartup.csファイル内に次のコードを含めることだけです。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .AddMvcOptions(o => o.OutputFormatters.Add(
              new XmlDataContractSerializerOutputFormatter()));
}

Microsoft.AspNetCore.Mvc.Formattersを参照する必要があります。

0
shana

Core 2.xバージョンの場合、2つのことを行う必要があります。まず、Startup.csファイルのConfigureServicesメソッド内に次のコードを追加する必要があります。

services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(
    new XmlDataContractSerializerOutputFormatter())
);

次に、Accept "application/xml"ヘッダーをリクエストに以下のPostmanで追加します。次に、XML形式の結果が返されます。

enter image description here

0
Asiri Jayaweera