【问题标题】:.NET Core: How to Output String from StreamReader as XML.NET Core:如何将 StreamReader 中的字符串输出为 XML
【发布时间】:2018-07-19 09:06:50
【问题描述】:

使用 MVC 在 .Net Core 2 中做一个项目,我正在尝试从 GitHub 合并一个项目,该项目为 RSS 提要生成 XML。它是 TAlex.RSSFeedGenerator。

要生成实际文档,FeedGenerator 的唯一选择是将其 RSS 对象序列化为 MemoryStream:

public void Generate(Rss rss, Stream output)
{
  XmlSerializer serializer = new XmlSerializer(typeof(Rss));
  serializer.Serialize(output, rss);
}

所以 FeedGenerator 已经将 RSS 内容序列化为 Stream 中的 XML,我想将该内容作为 XML 从 MVC 控制器 (return Ok(content_here)) 返回。

我该怎么做?

最初/目前合并:

var rss = new Rss();
// ...
var RssFeedGenerator = new FeedGenerator();
var output = new MemoryStream();
RssFeedGenerator.Generate(rss, output);
output.Position = 0;
var sreader = new StreamReader(output);
return Ok(sreader.ReadToEnd());

这会输出一个字符串,并被浏览器视为字符串。它不被视为 XML 或 RSS。

MVC 控制器的定义和装饰如下:

[HttpGet()]
[Produces("text/xml")]
public async Task<IActionResult> GetAsync() {...}

所以,我需要将已经是 XML 文档的字符串识别为 XML 文档,而不是字符串。我的目标也是直接将内容作为响应发送,而不是将其保存到文件中,然后必须将用户重定向到该文件或必须从文件中读取 Ok()。

另外,我无法将 MemoryStream 直接发送到 Ok(),因为我收到一个无法访问已关闭流的错误。

浏览器当前显示如下:

<string>&lt;?xml version="1.0" encoding="utf-16"?&gt; ... </string>

(最初,它可以正确解码 HTML 实体,因此您会看到:

<string><?xml version="1.0" encoding="utf-16"?> ... </string>

但现在它甚至没有这样做。)

【问题讨论】:

  • 您想将 RSS 作为 XML 文本返回吗?
  • 我将[Produces(...)] 更改为[Produces("application/rss+xml")]。它最初是 rss+xml,但我想我今天早些时候在解决一个不相关的问题时更改了它,并且在我移动到我可以访问的站点后错过了将其更改回来。
  • 我已经在上面的问题中包含了浏览器显示的内容。
  • @Umang 我有一个代表 RSS 提要的对象。它将生成作为 XML 文档的文本,但我试图让 .Net 或 MVC 或 IActionResult 或任何识别它正在接收的内容是或应该是 XML 的人。
  • @Umang 也许换一种说法,IActionResult 期望接收什么才能成功地将其输入序列化为 XML?如果我有一个已经是 XML 的对象,表示为字符串,为什么 IActionResult 不能将其正确序列化为 XML?

标签: asp.net-mvc asp.net-core


【解决方案1】:

感谢您的澄清。

请返回 ContentResult 以查看 RSS XML。你可以有“application/xml”或“application/RSS+XML”或“text/xml”

public async Task<IActionResult> GetAsync()
    {
        string rssFeed = "<?xml >...";
        return new ContentResult
        {
            Content = rssFeed,
            ContentType = "application/RSS+xml"
        };
    }

【讨论】:

  • 我会看看其他帖子。 MemoryStream 实际上并没有像这样使用。它在另一个函数中的 using 语句中,该函数完全处理 RSSFeedGenerator 的内容,并且只返回来自 ReadToEnd() 的字符串。
  • 这并不能解决问题。它提供了丰富的信息,因为您指出的基本上是 Generate() 方法已经在做的事情——只是针对 Stream obj 而不是 StringWriter obj。我为FeedGenerator实现了一个扩展函数,它从StringWriter返回字符串,但问题还是一样。 Ok() 仍然从 StringWriter 发送字符串,以便浏览器将其视为字符串,而不是 XML。
  • 请注意我添加到原始问题中的浏览器示例,如果这有助于理解我所看到的内容。
  • 看你的输出,你有没有想过返回内容结果。像这样: return new ContentResult() { Content =..., ContentType = "text/xml", };让我知道这是否有效,我会相应地更新答案
  • 是的,我认为类似的方法——绕过 MVC 的 ActionResults——会很好尝试。
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多