wcf – Rss20FeedFormatter忽略SyndicationItem.Summary的TextSyndicationContent类型

在WCF项目中使用Rss20FeedFormatter类时,我试图用<![CDATA []]>包装我的描述元素的内容.部分.我发现无论我做了什么,描述元素的 HTML内容总是被编码,并且从未添加CDATA部分.在深入研究Rss20FeedFormatter的源代码之后,我发现在构建Summary节点时,它基本上创建了一个新的TextSyndicationContent实例,该实例消除了之前指定的任何设置(我认为).

我的代码

public class CDataSyndicationContent : TextSyndicationContent
{
    public CDataSyndicationContent(TextSyndicationContent content)
        : base(content)
    {
    }

    protected override void WriteContentsTo(System.Xml.XmlWriter writer)
    {
        writer.WriteCData(Text);
    }
}

…(以下代码应使用CDATA部分包装摘要)

SyndicationItem item = new SyndicationItem();
item.Title = new TextSyndicationContent(name);
item.Summary = new CDataSyndicationContent(
                   new TextSyndicationContent(
                         "<div>This is a test</div>", 
                         TextSyndicationContentKind.Html));

Rss20FeedFormatter代码
(AFAIK,上面的代码由于这个逻辑不起作用)

...
else if (reader.IsStartElement("description", ""))
   result.Summary = new TextSyndicationContent(reader.ReadElementString());
...

作为一种解决方法,我已经使用RSS20FeedFormatter来构建RSS,然后手动修补RSS.例如:

StringBuilder buffer = new StringBuilder();
        XmlTextWriter writer = new XmlTextWriter(new StringWriter(buffer));
        feedFormatter.WriteTo(writer ); // feedFormatter = RSS20FeedFormatter

        PostProcessOutputBuffer(buffer);
        WebOperationContext.Current.OutgoingResponse.ContentType = 
                                   "application/xml; charset=utf-8";
        return new MemoryStream(Encoding.UTF8.GetBytes(buffer.ToString()));

public void PostProcessOutputBuffer(StringBuilder buffer)
    {
        var xmlDoc = XDocument.Parse(buffer.ToString());
        foreach (var element in xmlDoc.Descendants("channel").First()
                                      .Descendants("item")
                                      .Descendants("description"))
        {
            VerifyCdataHtmlEncoding(buffer, element);
        }

        foreach (var element in xmlDoc.Descendants("channel").First()
                                      .Descendants("description"))
        {
            VerifyCdataHtmlEncoding(buffer, element);
        }

        buffer.Replace(" xmlns:a10=\"http://www.w3.org/2005/Atom\"",
                       " xmlns:atom=\"http://www.w3.org/2005/Atom\"");
        buffer.Replace("a10:", "atom:");
    }

    private static void VerifyCdataHtmlEncoding(StringBuilder buffer,
                                                XElement element)
    {
        if (!element.Value.Contains("<") || !element.Value.Contains(">"))
        {
            return;
        }

        var cdataValue = string.Format("<{0}><![CDATA[{1}]]></{2}>",
                                       element.Name,
                                       element.Value, 
                                       element.Name);
        buffer.Replace(element.ToString(), cdataValue);
    }

这个解决方法的想法来自以下位置,我只是将其调整为使用WCF而不是MVC. http://localhost:8732/Design_Time_Addresses/SyndicationServiceLibrary1/Feed1/

我只是想知道这只是Rss20FeedFormatter中的一个错误还是设计?此外,如果有人有更好的解决方案,我很乐意听到它!

那么@Page Brooks,我认为这更像是一个解决方案然后作为一个问题:).谢谢!!!并回答你的问题(;)),是的,我肯定认为这是Rss20FeedFormatter中的一个错误(虽然我没有追逐到目前为止),因为遇到了与你描述的完全相同的问题.

你的帖子中有一个’localhost:8732’推荐,但我的localhost上没有这个推荐;).我想你的意思是将’PostProcessOutputBuffer’解决方法归功于这篇文章:
http://damieng.com/blog/2010/04/26/creating-rss-feeds-in-asp-net-mvc

或者实际上它不是在这篇文章中,而是在David Whitney的评论中,后来他在这里单独提出了一个要点:
https://gist.github.com/davidwhitney/1027181

感谢您为我的需求提供更多适应性,因为我也找到了解决方法,但仍然在努力从MVC进行改编.现在我只需要调整你的解决方案,将RSS提要放在我使用它的.ashx处理程序中的当前Http请求中.

基本上我猜你使用CDataSyndicationContent提到的修复是从2011年2月开始,假设你从这篇文章中得到它(至少我做到了):
SyndicationFeed: Content as CDATA?

由于Rss20FeedFormatter的代码更改为您在帖子中的内容,此修复程序停止在某些较新的ASP.NET版本中工作.这个代码更改可能也是对MVC框架中的其他东西的改进,但对于那些使用CDataSyndicationContent修复的人来说肯定会导致错误!

相关文章
相关标签/搜索