【问题标题】:ASP.Net Core how to parse XML Request with ISO-8859-1 CharsetASP.Net Core 如何使用 ISO-8859-1 字符集解析 XML 请求
【发布时间】:2021-11-05 07:13:34
【问题描述】:

我正在尝试创建一个将 XML 作为输入的 Web API。 问题是请求被编码为 ISO-8859-1。

起初我尝试只使用XmlDocument 参数,但是当编码错误时它给出了500 错误:

[HttpPost]
public IActionResult XmlEndpoint([FromBody] XmlDocument requestXmlBody)

接下来我尝试自己解析它,但这从未正确关闭请求,并导致 HTTP 客户端在 XML 格式错误时永远连接。

[HttpPost]
public async Task<IActionResult> XmlEndpoint()
{
    using var stringReader = new StreamReader(Request.Body, dataEncodingFromByteOrderMarks: true))
    var body = await stringReader.ReadToEndAsync();
    var requestXmlBody = new XmlDocument();
    requestXmlBody.LoadXml(body);

之后我尝试部分使用 ASP.NET Core 功能,但是当使用 ISO-8599-1 时,这会给出Unsupported Media Type

[HttpPost]
public async Task<IActionResult> XmlEndpoint([FromBody] string content)
{
    var requestXmlBody = new XmlDocument();
    requestXmlBody.LoadXml(content);

这是我用来测试的命令:

curl -XPOST 'https://localhost/api/XmlEndpoint' --data "<broken</broken>" -H "Content-Type: application/xml;charset=iso-8859-1"

如何从ISO-8859-1 编码请求中获取XMLDocument

【问题讨论】:

  • 为什么不在 StreamReader 中指定System.Text.Encoding.Latin1?这种“从未正确关闭请求”不应该发生,你可能只是在你的控制器中有一个错误。
  • @DavidBrowne-Microsoft System.Text.Encoding.Latin1 在我能找到的任何地方都不存在,但我确实找到了 Encoding.GetEncoding("ISO-8859-1")。感谢您暗示不是此代码而是其他代码,我写了一个答案来解决我的问题。

标签: c# asp.net-core-webapi streamreader xmldocument iso-8859-1


【解决方案1】:

我设法解决了尝试 2. 的问题。 我让它从未正确关闭连接的原因是因为我有一个自定义中间件因为StreamReader 关闭了流而中断。

所以最终对我有用的解决方案是:

[HttpPost]
public async Task<IActionResult> WriteXmlToFile()
{
    using var stringReader = new StreamReader(Request.Body, Encoding.GetEncoding("ISO-8859-1"), leaveOpen: true);
    var body = await stringReader.ReadToEndAsync();

    var requestXmlBody = new XmlDocument();
    requestXmlBody.LoadXml(body);

感谢@DavidBrowne-Microsoft 让我意识到不应该是这段代码导致连接挂起,而是其他原因。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2013-01-19
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多