我无法使用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相关的任何内容,即使添加了输入和输出格式化程序,正如我在极少数示例中看到的那样。
我错过了什么?
答案 0 :(得分:4)
我在startup.cs中有以下内容,它适用于XML和JSON。 在这里,我只坚持使用XML。 注意:(我已经考虑了我自己的课程样本)
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddJsonFormatters().AddXmlSerializerFormatters();
}
我的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"]
}
}
就是这样!它只是有效。
使用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