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