如果内容是XML格式的,我如何在.NET Core 2.2中进行POST



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

这是我的ConfigureServices方法:

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

这是我的控制器:

[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格式有效,如果我接受它作为输出类型,它就会变得清晰。但是,如果我自己将其作为内容类型发布并测试,我会得到500分。我也尝试过这种(旧的)方法,但它似乎在.NET Core 2.2中不起作用。我做错了什么?如何在.net core 2.2中发布我的xml?

一句有用的话之后的更新导致500的异常是这样的:

System.InvalidOperationException:XML文档中存在错误(1,11)--->System.InvalidOperationException:不是预期。

但是,如果我添加一个xmlns(基于此),我仍然有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:XML文档中存在错误(1,56)。--->System.InvalidOperationException:https://www.w3schools.com/furniture不应为'>。

可能,我需要更改我的xml。怎样即使是w3c学校的例子也对我没有帮助

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

对于带有<A a="5"/>Content-Type: application/xml,如果您更喜欢接收<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类对象填充值。

相关内容

  • 没有找到相关文章

最新更新