【发布时间】: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><?xml version="1.0" encoding="utf-16"?> ... </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?