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>();
        }