ASP.NET Core 1.0 Web API не возвращает XML
Как я могу иметь API vnext для возврата XML и JSON ?
Я думал, что использование content-type С application / xml будет работать так же, как и раньше. Обратите внимание, что я тоже пытался принять: application / xml.
но, кажется, нет.
EDIT:
Это мой проект.файл json:
{
"webroot": "wwwroot",
"version": "1.0.0-*",
"dependencies": {
"Microsoft.AspNet.Server.IIS": "1.0.0-beta4",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
"Microsoft.AspNet.Mvc": "6.0.0-beta4",
"Microsoft.AspNet.Mvc.Xml": "6.0.0-beta4"
},
"commands": {
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
},
"frameworks": {
"dnx451": { },
"dnxcore50": { }
},
"publishExclude": [
"node_modules",
"bower_components",
"**.xproj",
"**.user",
"**.vspscc"
],
"exclude": [
"wwwroot",
"node_modules",
"bower_components"
]
}
Это мой стартап.cs:
public class Startup
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.ConfigureMvc(options =>
{
//options.AddXmlDataContractSerializerFormatter();
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
}
}
8 ответов
по умолчанию Xml-форматеры не включены в состав Microsoft.AspNet.Mvc
пакета. Вам нужно сослаться на другой пакет под названием Microsoft.AspNet.Mvc.Xml
для этого.
пример того, как вы можете добавить форматтеры:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.ConfigureMvc(options =>
{
// This adds both Input and Output formatters based on DataContractSerializer
options.AddXmlDataContractSerializerFormatter();
// To add XmlSerializer based Input and Output formatters.
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});
обновленные сведения после выпуска .Net Core 1.0.0
Автозагрузка.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc(config =>
{
// Add XML Content Negotiation
config.RespectBrowserAcceptHeader = true;
config.InputFormatters.Add(new XmlSerializerInputFormatter());
config.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});
.в JSON
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.Mvc.Formatters.Xml": "1.0.0",
для получения дополнительной помощи см. сообщение блога Shawn Wildermuths по этому вопросу:согласование контента в ASP.NET ядро
вот обновленный ответ для MVC6 rc1
Автозагрузка.КС (используя MvcXmlMvcBuilderExtensions)
public void ConfigureServices(IServiceCollection services)
{
var mvcBuilder = services.AddMvc();
mvcBuilder.AddXmlSerializerFormatters();
// or mvcBuilder.AddXmlDataContractSerializerFormatters()
.в JSON
"dependencies": {
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final",
Не забудьте как ASP.NET 5 был переименован в ASP.NET Core 1.0 и так Microsoft.AspNet.Mvc
стало Microsoft.AspNetCore.Mvc
то есть
"dependencies": {
"Microsoft.AspNetCore.Mvc" : "1.0.2",
"Microsoft.AspNetCore.Mvc.Formatters.Xml" : "1.0.2",
столкнулся с аналогичными проблемами, должен обрабатывать в одной службе API WEB REST, с использованием ASP .NET MVC Core 1.1.0, два типа запросов тела XML DataContractSerializer и XmlSerializer.
Итак, в моем случае мне нужно FromXmlBody и XmlResult с параметром типа XML-сериализации. Прочитайте эту тему и подумайте, чтобы написать мир кода с работой, но когда я посмотрю на GitHub. Я нашел это. решение уже существует. Я проверил, это похоже на качественное программное инженерное решение. Я хочу поделиться ссылками: Вот новое расширение XML для Asp.NET Core ver. >=1.1.0 Расширения Xmlresult и FromXmlBody ASP.NET основные MVC-форматеры для ввода и вывода XML с помощью DataContractSerializer и XmlSerializer. https://github.com/Wallsmedia/XmlResult пакет самородка: https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Formatters.Xml.Extensions Он отлично работает для обоих типов XML-сериализации (DataContractSerializer и XmlSerializer) в одном сервисе/контроллере/методе. Вот пример: [Route("api/[controller]")]
public class XmlExtController : Controller
{
// GET api/[controller]/xml
[HttpGet("xml")]
public ActionResult GetXmlObject()
{
object obj = new PurchaseOrder();
return new XmlResult(obj);
}
// GET api/[controller]/dcxml
[HttpGet("dcxml")]
public ActionResult GetDcXmlObject()
{
object obj = new PurchaseOrder();
return new XmlResult(obj) { XmlSerializerType = XmlSerializerType.DataContractSerializer };
}
// POST api/[controller]/xml
[HttpPost("xml")]
public void PostXml([FromXmlBody]PurchaseOrder value)
{
var x = value;
x.billTo.street += " 123";
}
// POST api/[controller]/dcxml
[HttpPost("dcxml")]
public void PostDcXml([FromXmlBody(XmlSerializerType = XmlSerializerType.DataContractSerializer)]PurchaseOrder value)
{
var x = value;
x.billTo.street += "No -10";
}
}
MVC 6 RespectBrowserAcceptHeader по умолчанию имеет значение false. Следовательно, он будет обходить согласование контента. И вот почему, вероятно, вы получаете XML всегда после включения XML-форматирования.
вы можете превратить RespectBrowserAcceptHeader в true, добавив следующее в файл автозагрузки:
services.Configure<MvcOptions>(options =>
{
options.RespectBrowserAcceptHeader = true;
});
обновленный ответ для ASP.NET ядро 1.1:
Автозагрузка.cs:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc(config => {
config.RespectBrowserAcceptHeader = true;
config.InputFormatters.Add(new XmlSerializerInputFormatter());
config.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});
}
Csproj:
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="1.1.3" />
вы просите hastto отправить AcceptHeader application / xml
Accept: какие типы носителей приемлемы для ответа, например "application/json", "application / xml" или пользовательский тип носителя, например "приложения/донгов.пример+xml
content-type определяет, что вы отправляете Смотрите также разница между заголовком Accept и ContentType
Я не уверен, что содержание negiotiation is for xml активируется по умолчанию в asp.net 5 webapi
посмотрите на эту статью:согласование контента и веб-API для ASP.NET разработчик MVC
это упрощено в RC2 только для служб.AddMvc ().AddXmlDataContractSerializerFormatters ();
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.AddMvc().AddXmlDataContractSerializerFormatters();
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}