次の単純な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データだけです。
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
を返すテンプレートから新しいWebAPIプロジェクトを作成し、そこにインスピレーションがあるかどうかを確認します(実際にはそうではありません)。
シンプルだと思いますが、見えません...
XMLフォーマッターは、別のパッケージの一部です:Microsoft.AspNetCore.Mvc.Formatters.Xml
上記のパッケージを追加し、startup.csを以下のように更新します。
services
.AddMvc()
.AddXmlDataContractSerializerFormatters();
OR
services
.AddMvc()
.AddXmlSerializerFormatters();
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 [〜#〜]を返します。
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で機能するはずです
MVC 1.1の場合、パッケージを追加する必要がありますMicrosoft.AspNetCore.Mvc.Formatters.Xml
を編集してStartup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => { options.RespectBrowserAcceptHeader = true; })
.AddXmlSerializerFormatters()
.AddXmlDataContractSerializerFormatters();
}
これでAcceptヘッダーを設定できます。
XML:application/xml
JSON:application/json
Core 2.xバージョンの場合、行う必要があるのはConfigureServieメソッドStartup.csファイル内に次のコードを含めることだけです。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(
new XmlDataContractSerializerOutputFormatter()));
}
Microsoft.AspNetCore.Mvc.Formattersを参照する必要があります。