Xml请求不起作用

时间:2016-08-29 06:44:29

标签: c# asp.net-core asp.net-core-webapi

我无法使用Xml而不是Json来使用Asp.Net Core Web Api项目。请帮忙!

我创建了一个新项目,对默认配置的唯一调整就是添加Xml格式化程序......

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddApplicationInsightsTelemetry(Configuration);

    services.AddMvc(config =>
    {
        config.InputFormatters.Add(new XmlSerializerInputFormatter());
        config.OutputFormatters.Add(new XmlSerializerOutputFormatter());
    });
}

我的控制器还包含简单的Get和Post方法:

[Route("api")]
public class MessageController : Controller
{
    [HttpPost]
    public void Post([FromBody] Message message)
    {

    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new Message
        {
            TestProperty = "Test value"
        });
    }
}

当我尝试使用POST调用Content-Type: application/xml方法时,API会返回415 Unsupported Media Type。我已经尝试将Consumes("application/xml")属性添加到控制器中,但它仍无效。

GET工作并返回JSON。但是,如果我将Produces("application/xml")属性添加到控制器,则即使我提供Accepts: application/xml标头,GET也会返回406 Not Acceptable。

出于某种原因,API完全拒绝与xml相关的任何内容,即使添加了输入和输出格式化程序,正如我在极少数示例中看到的那样。

我错过了什么?

3 个答案:

答案 0 :(得分:4)

我在startup.cs中有以下内容,它适用于XML和JSON。 在这里,我只坚持使用XML。 注意:(我已经考虑了我自己的课程样本)

  1. Startup.cs

    public void ConfigureServices(IServiceCollection services)
        { 
            services.AddMvcCore()
                    .AddJsonFormatters().AddXmlSerializerFormatters();
        }
    
  2. 我的HttpClient代码(您可能错过了我在StringCotent中完成的内容类型设置)

    • 两个标头很重要:接受和内容类型。接受内容协商中的帮助,Content-Type是客户端告诉服务器客户端发布的内容类型的方式。

       HttpClient client = new HttpClient();
       client.BaseAddress = new Uri( @"http://localhost:5000");
       client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
      
      
       HttpContent content = new StringContent(@"<Product>
      <Id>122</Id>
      <Name>Computer112</Name></Product>",System.Text.Encoding.UTF8 , "application/xml");  // This is important.
      
      var result = client.PostAsync("/api/Products", content).Result;
      

答案 1 :(得分:2)

在ASP.Net Core 2.0中,您几乎可以接受XML和Json请求。

在ConfigureServices方法的Startup类中,您应该:

services
    .AddMvc()
    .AddXmlSerializerFormatters();

接受复杂对象的控制器如下所示:

[Route("api/Documents")]
public class DocumentsController : Controller
{
    [Route("SendDocument")]
    [HttpPost]
    public ActionResult SendDocument([FromBody]DocumentDto document)
    {
        return Ok();
    }
}

这是一个要发送的XML:

<document>
    <id>123456</id>
<content>This is document that I posted...</content>
<author>Michał Białecki</author>
<links>
    <link>2345</link>
    <link>5678</link>
</links>

{
    id: "1234",
    content: "This is document that I posted...",
    author: "Michał Białecki",
    links: {
        link: ["1234", "5678"]
    }
}

就是这样!它只是有效。

.net core debugging

使用XML或Json中的相同文档请求api / documents / SendDocument端点由一个方法处理。只记住请求中的正确Content-Type标头。

您可以在我的博客上阅读整篇文章:http://www.michalbialecki.com/2018/04/25/accept-xml-request-in-asp-net-mvc-controller/

答案 2 :(得分:0)

对于ASP.NET Core 2.2,使用nuget包 Microsoft.AspNetCore.Mvc.Formatters.Xml Microsoft.AspNetCore.App 并将其添加到Startup.cs

#include<bits/stdc++.h>

using namespace std;
//#define mySizeOf(T) (char*)(&T + 1) - (char*)(&T)

        template<class T>
size_t mySizeOf(T)
{
        T temp1;
        return (char*)(&temp1 + 1) - (char*)(&temp1);
}
int main()
{
        int num = 5;
        long numl = 10;
        long long numll = 100;
        unsigned int num_un_sz = 500;

        cout<<"size of int="<<mySizeOf(num) << endl;
        cout<<"size of long="<<mySizeOf(numl) << endl;
        cout<<"size of long long ="<<mySizeOf(numll) << endl;
        cout<<"size of unsigned int="<<mySizeOf(num_un_sz) << endl;
        return 0;
}

别忘了使用标头接受application / xml 以xml的形式获取响应,以及 Content-Type application / xml 以xml正文进行请求。

在此处查看示例http://www.devcode4.com/article/asp-net-core-xml-request-response