gpt4 book ai didi

c# - 如果内容是 XML 格式,我如何在 .NET Core 2.2 中执行 POST?

转载 作者:行者123 更新时间:2023-11-30 16:38:40 26 4
gpt4 key购买 nike

我对这个问题感到非常惊讶,因为我记得在早期的 .NET Core 版本中成功解决了这个问题。我正在开发一个 .NET Core 2.2 应用程序,现在需要由另一个只能发布 xml 的应用程序(外部开发)调用....

这是我的 ConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddXmlSerializerFormatters();
}

这是我的 Controller :

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// POST api/values
[HttpPost]
public ActionResult<object> Post([FromBody] object value)
{
return ("Hi", "Hi2");
}
}

以下请求会导致状态码为 200 的响应:

POST http://localhost:58774/api/values
Content-Type: application/json
Accept: application/xml
User-Agent: vscode-restclient
Accept-Encoding: gzip

{"a":5}

它给我 xml 作为响应

POST http://localhost:58774/api/values
Content-Type: application/json
Accept: application/json
User-Agent: vscode-restclient
Accept-Encoding: gzip

{"a":5}

给出 json 作为响应。

但是,此调用导致状态代码为 500 的响应(这正是我的问题):

POST http://localhost:58774/api/values
Content-Type: application/xml
Accept: application/xml
User-Agent: vscode-restclient
Accept-Encoding: gzip

<A a="5"/>

所以我现在有麻烦了。如果我接受它作为输出类型,Xml 格式就可以工作了。但是,如果我自己将其作为 Content-Type 发布并进行测试,我会得到 500。我还尝试了 this (old) approach但它似乎在 .NET Core 2.2 中不起作用。我究竟做错了什么?如何在 .net core 2.2 中发布我的 xml?

有用评论后的更新。导致 500 的异常是这个:

System.InvalidOperationException: There is an error in XML document (1, 11). ---> System.InvalidOperationException: was not expected.

但是,如果我添加一个 xmlns(基于 this),我仍然有 500:

POST http://localhost:5000/api/values
Content-Type: application/xml
Accept: application/xml
User-Agent: vscode-restclient
Accept-Encoding: gzip

<f:table xmlns:f="https://www.w3schools.com/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

那么异常信息是:

System.InvalidOperationException: There is an error in XML document (1, 56). ---> System.InvalidOperationException: https://www.w3schools.com/furniture'> was not expected.

可能,我需要更改我的 xml。如何?即使是 w3cschools 的例子也对我没有帮助。

最佳答案

对于 Content-Type: application/json{"a":5} ,您将收到 { "a": 5 }在服务器端。它收到纯文本。

对于 Content-Type: application/xml<A a="5"/> , 如果你喜欢接收 <A a="5" /> , 你可以实现自定义 XDocumentInputFormatter喜欢

public class XDocumentInputFormatter : InputFormatter, IInputFormatter, IApiRequestFormatMetadataProvider
{
public XDocumentInputFormatter()
{
SupportedMediaTypes.Add("application/xml");
}

protected override bool CanReadType(Type type)
{
if (type.IsAssignableFrom(typeof(XDocument))) return true;
return base.CanReadType(type);
}

public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var xmlDoc = await XDocument.LoadAsync(context.HttpContext.Request.Body, LoadOptions.None, CancellationToken.None);

return InputFormatterResult.Success(xmlDoc);
}
}

Startup.cs中注册

services.AddMvc(config =>
{
config.InputFormatters.Insert(0, new XDocumentInputFormatter());
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddXmlSerializerFormatters();

默认情况下,对于 XmlSerializer , 我们需要提供 Type type ,对象类型将无法反序列化。

如果 object value 的类型定义为

public class A
{
public int a { get; set; }
}

你可以像这样改变你的方法

public ActionResult<object> Post([FromBody] A value)
{
return new A { a = 1 };//("Hi", "Hi2");
}

还有像这样的请求

<A>
<a>1</a>
</A>

它将用 A 类对象填充值。

关于c# - 如果内容是 XML 格式,我如何在 .NET Core 2.2 中执行 POST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54679430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com