ASP.NET Core 1.0 Web API не возвращает XML
Как я могу использовать API vnext для возврата XML и JSON?
Я думал, что использование content-type с приложением /xml будет работать так, как было раньше.
Обратите внимание, что я также пробовал с помощью Accept: application/xml.
Но это не так.
ИЗМЕНИТЬ:
это мой файл project.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"
]
}
это мой startup.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();
}
}
Ответы
Ответ 1
По умолчанию форматы Xml не включены как часть пакета Microsoft.AspNet.Mvc
. Для этого вам нужно ссылаться на другой пакет с именем Microsoft.AspNet.Mvc.Xml
.
Пример того, как вы можете добавить formatters:
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());
});
Ответ 2
Обновлена информация после выпуска .Net Core 1.0.0
startup.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());
});
project.json
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.Mvc.Formatters.Xml": "1.0.0",
Для получения дополнительной информации см. сообщение в блоге Shawn Wildermuths на тему: Консолидация содержимого в ядре ASP.NET
Ответ 3
Вот обновленный ответ для MVC6 rc1
Startup.cs(используя MvcXmlMvcBuilderExtensions)
public void ConfigureServices(IServiceCollection services)
{
var mvcBuilder = services.AddMvc();
mvcBuilder.AddXmlSerializerFormatters();
// or mvcBuilder.AddXmlDataContractSerializerFormatters()
project.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",
Ответ 4
Столкнувшись с подобными проблемами, нужно обработать в одной службе API WEB REST с использованием ASP.NET MVC Core 1.1.0, двух типов запросов тела XML DataContractSerializer и XmlSerializer strong > .
Итак, в моем случае мне нужен FromXmlBody и XmlResult с параметром типа сериализации XML.
Прочитайте эту тему и подумайте, чтобы написать мир кода с работой, но когда я посмотрю на GitHub. Я обнаружил, что решение уже существует.
Я проверил, это похоже на качественное программное обеспечение.
Я хочу поделиться ссылками:
Вот новое расширение XML для Asp.NET Core ver. >= 1.1.0
Расширения XmlResult и FromXmlBody форм файлов ASP.NET Core MVC для ввода и вывода XML с использованием DataContractSerializer и XmlSerializer.
https://github.com/Wallsmedia/XmlResult
nugget package: 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";
}
}
Ответ 5
MVC 6 RespectBrowserAcceptHeader по умолчанию является ложным. Следовательно, он будет обходить согласование содержимого. И поэтому, возможно, вы получаете XML всегда после включения форматирования XML.
Вы можете включить RespectBrowserAcceptHeader в значение true, добавив в файл запуска следующий файл:
services.Configure<MvcOptions>(options =>
{
options.RespectBrowserAcceptHeader = true;
});
Ответ 6
Вы запрашиваете hastto для отправки AcceptHeader приложения /xml
Принять: какие типы медиа приемлемы для ответа, например "application/json", "application/xml" или настраиваемый тип носителя, например "Приложение/vnd.example + XML
content-type определяет, что вы отправляете, см. также Разница между Accept и ContentType Header
Я не уверен, что контент-хаотичность для xml активируется по умолчанию в asp.net 5 webapi
см. эту статью: Консолидация контента и веб-API для разработчика ASP.NET MVC
Ответ 7
Обновлен ответ для ASP.NET Core 1.1:
Startup.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" />
Ответ 8
Это упрощено в RC2 только для services.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>();
}