ASP.NET Core 1.0 Web API不返回XML。

11

我该如何使我的vnext API返回XML和JSON格式的数据?

我以前认为使用content-type并选择application/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();
    }
}
8个回答

12

默认情况下,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());
    });

谢谢,但现在我总是得到XML。 - Tim
我已经测试了 Accept: application/xml 和 application/json 以及 content-type 的两种方式...但我总是得到 XML。 - Tim
你能分享一下你的配置文件长什么样吗? - Kiran
1
看起来选项注册有一个错误。你能重新调整你的调用顺序,先调用 AddMvc(),然后再调用 ConfigureMvc 吗? - Kiran
1
@Tim:仅供参考...此错误已经修复,将在下一个版本中提供...即您应该能够在AddMvc之前或之后调用ConfigureMvc而不会出现任何问题。 - Kiran
在RC2中有什么不同吗?我的“services”没有ConfigureMvc方法。 - Patrick Szalapski

12

.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 Wildermuth的博客文章:ASP.NET Core中的内容协商


1
不再与MVC 1.0.1兼容!似乎在网上找不到关于这个问题的信息。 - emirhosseini
我发现这个不起作用。在另一个具有完全相同配置和代码的示例项目中可以运行。我注意到工作的项目(即遵守accept-header并按指定返回json或xml)与不工作的项目之间唯一的区别是,在工作的项目中,只引用了Microsoft.AspNetCore.Mvc.Formatters.Xml(1.0.1) ,而在不工作的项目中,引用了 Microsoft.AspNetCore.Mvc.Formatters.Json(1.0.1)Microsoft.AspNetCore.Mvc.Formatters.Xml(1.0.1),并且顺序如此。 - Shiva
是的,这里没有任何一个答案再有效了。这非常令人沮丧,因为所有在线资料都指向这个问题,而它现在已经非常过时了。 - Chris Pratt

4

以下是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

面对相似的问题,必须在一个WEB REST API服务中进行处理,使用ASP .NET MVC Core 1.1.0,两种类型的XML body请求DataContractSerializerXmlSerializer

FromXmlBody XmlResult https://github.com/Wallsmedia/XmlResult https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Formatters.Xml.Extensions
 [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";
    }

}

3

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" />

2
MVC 6 RespectBrowserAcceptHeader的默认值为false。因此,它将绕过内容协商。这可能是启用XML格式化程序后始终获得XML的原因。
您可以通过在启动文件中添加以下内容将RespectBrowserAcceptHeader更改为true:
services.Configure<MvcOptions>(options =>
        {
            options.RespectBrowserAcceptHeader = true;
        });

1

我也尝试了使用 Accept,但是我没有说过那句话。 - Tim
那你是否检查了XML内容协商是否已激活?请参见我帖子中的链接。 - Boas Enkler
1
这似乎是在ASP.NET 4.X上,我知道如何使用Web API 2进行内容协商,但我的问题出现在ASP.NET 5(vnext)上。 - Tim

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接