在 ASP.NET 3.5 中创建 RSS 源

发布于 2024-08-24 08:59:18 字数 134 浏览 4 评论 0原文

如何使用 C# 在 ASP.NET 3.5 中创建 RSS 提要?

哪些框架部分可以帮助 .NET 开发人员更轻松地发布 RSS 或 Atom 提要?

.NET 4 中是否有任何额外功能可以使此任务比 3.5 中更容易?

How would you create an RSS feed in ASP.NET 3.5 using C#?

What framework pieces would help in making the publishing of an RSS or Atom feed easier for the .NET developer?

Are there any extra features in .NET 4 to make this task easier than in 3.5?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

3.5 中有一个新的命名空间,名为 System.ServiceModel.Syndicate

凯文·米勒 对此有一篇很棒的文章,但关于新命名空间的内容却不是很多。

创建一个包含 Feed 项目的 SyndicatedFeed,并将其交给 Feed Formatter。

生成 RSS 提要

public void ProcessRequest(HttpContext context)
{
   SyndicateFeed feed = CreateRecentSolutionsFeed();

   var 输出 = new StringWriter();
   var writer = new XmlTextWriter(输出);

   新的 Rss20FeedFormatter(feed).WriteTo(writer);

   context.Response.ContentType = "application/rss+xml";
   context.Response.Write(output.ToString());
}

我们必须从某个地方提供此提要。 Josh 并不是真正的 ASP.NET 专家,他让我开始使用通用处理程序。这似乎是一个简单的构造,用于简单地从 URL 中吐出内容。完美的。 [原文如此]

“在此处输入图像描述"

联合供稿

为了构建联合组织,我创建了这个小辅助方法。

private static SyndicatedFeed CreateRecentSolutionsFeed()
{
   var syndicates = GetRecentOrModifiedSolutionSyndicates(TimeSpan.FromDays(30));

   返回新的 SyndicateFeed(synminationItems)
   {
       Title = new TextSyndicateContent("Dovetail 软件知识库"),
       Description = new TextSyndicateContent(“最近创建或修改了有关 Dovetail Software 提供的产品的解决方案。”),
       ImageUrl = new Uri("http://www.dovetailsoftware.com/images/header_logo.gif")
   };
}

组装联合项目

我将跳过血淋淋的 Dovetail SDK 数据访问代码,该代码会发送到 Clarify 数据库并具体化过去 30 天内创建或修改的任何解决方案。当然,除非我的两位读者之一提出很好的要求。无论如何,有趣的是,它基本上循环遍历找到的所有解决方案,并为每个解决方案组装一个联合项目。

private static SyndicateItem AssembleSolutionSyndicateItem(ClarifyDataRow 解决方案)
{
   var id = 解决方案["id_number"].ToString();
   var title = String.Format("[{0}] {1}", id, 解决方案["标题"]);
   var content =解决方案[“描述”].ToString();
   var url = new Uri(String.Format("http://www.dovetailsoftware.com/resources/solutions/{0}.aspx", id));

   返回新的 SyndicateItem(title, null, url) { 摘要 = new TextSyndicateContent(content) };
}

结果

最终结果是完全硬编码的 HTTP 处理程序,为 Dovetail 的客户生成希望有用的 RSS 提要。

“在此处输入图像描述"

下一步是在我们的知识库页面的 HTML 标题中添加一个元链接到提要。这使得 RSS 小图标显示在诚实、正派、努力工作的网络浏览器的地址栏中。

link rel="alternate" type="application/rss+xml" href="/resources/knowledgeBaseFed.ashx" title="Dovetail 知识库提要"/

There's a new namespace for this in 3.5 called System.ServiceModel.Syndication.

Kevin Miller has a great writeup on this, not a whole lot too it with the new namespace.

Create a SyndicatedFeed filled with feed items and hand that to a Feed Formatter.

Generating an RSS feed

public void ProcessRequest(HttpContext context)
{
   SyndicationFeed feed = CreateRecentSolutionsFeed();

   var output = new StringWriter();
   var writer = new XmlTextWriter(output);

   new Rss20FeedFormatter(feed).WriteTo(writer);

   context.Response.ContentType = "application/rss+xml";
   context.Response.Write(output.ToString());
}

We have to serve this feed from somewhere. Not really being an ASP.NET expert, Josh got me started with a Generic Handler. Which seems a thin construct for simply spiting content out of a URL. Perfect. [sic]

enter image description here

A Syndication Feed

To build the syndication I created this little helper method.

private static SyndicationFeed CreateRecentSolutionsFeed()
{
   var syndicationItems = GetRecentOrModifiedSolutionSyndicationItems(TimeSpan.FromDays(30));

   return new SyndicationFeed(syndicationItems)
   {
       Title = new TextSyndicationContent("Dovetail Software Knowledge Base"),
       Description = new TextSyndicationContent("Recently created or modified solutions regarding products offered by Dovetail Software."),
       ImageUrl = new Uri("http://www.dovetailsoftware.com/images/header_logo.gif")
   };
}

Assembling a Syndication Item

I'll skip the gory Dovetail SDK data access code that goes out to the Clarify database and materializes poof any solutions that have been created or modified in the last 30 days. Unless, of course, one of my 2 readers asks nicely for it. The interesting bit in any case is that it basically loops over all the solutions found and assembles a Syndication Item for each one.

private static SyndicationItem AssembleSolutionSyndicationItem(ClarifyDataRow solution)
{
   var id = solution["id_number"].ToString();
   var title = String.Format("[{0}] {1}", id, solution["title"]);
   var content = solution["description"].ToString();
   var url = new Uri(String.Format("http://www.dovetailsoftware.com/resources/solutions/{0}.aspx", id));

   return new SyndicationItem(title, null, url) { Summary = new TextSyndicationContent(content) };
}

Results

The end result is a totally hard coded HTTP Handler generating an hopefully useful RSS feed for Dovetail’s customers.

enter image description here

Next up was to add a meta link to the feed in the HTML header of our knowledge base pages. This makes the little RSS icon shows in the address bar of honest and decent hard working web browsers.

link rel="alternate" type="application/rss+xml" href="/resources/knowledgeBaseFed.ashx" title="Dovetail Knowledgebase Feed"/
长安忆 2024-08-31 08:59:18
public void BindData()
{                    

    StringWriter sw = new StringWriter();
    XmlTextWriter writer = new XmlTextWriter(sw);
    XmlDocument doc = new XmlDocument();
    XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);

    writer.WriteStartElement("feed");
    writer.WriteAttributeString("xmlns", "http://www.w3.org/2005/Atom");
    writer.WriteString("\n");
    writer.WriteElementString("title", this.TTT + " - " + this.Title);
    writer.WriteString("\n");


    writer.WriteStartElement("link");
    writer.WriteAttributeString("href", this.Url );
    writer.WriteEndElement();

    writer.WriteElementString("id", "urn:uuid:" + Guid.NewGuid().ToString());            
    writer.WriteElementString("updated", DateTime.UtcNow.ToString("o"));


    foreach (var  item in this.lista)
    {
        writer.WriteStartElement("entry");
        writer.WriteElementString("title", item.Value.Title);

        writer.WriteStartElement("link");
        writer.WriteAttributeString("href", item.Key);
        writer.WriteEndElement();

        writer.WriteElementString("id", item.Key);
        string slikaImgUrl = item.Value.Imaga;

        if (string.IsNullOrEmpty(slikaImgUrl) == false)
        {
            writer.WriteStartElement("link");
            writer.WriteAttributeString("rel", "enclosure");
            writer.WriteAttributeString("type", "image/jpeg");
            writer.WriteAttributeString("href", slikaImgUrl);
            writer.WriteEndElement();
        }

        writer.WriteStartElement("author");
        writer.WriteElementString("name", this.Title);
        writer.WriteEndElement();

        writer.WriteStartElement("summary");
        writer.WriteAttributeString("type", "text");
        writer.WriteCData(" ");
        writer.WriteEndElement();               

        writer.WriteElementString("updated", DateTime.UtcNow.ToString("o"));
        writer.WriteElementString("published", DateTime.UtcNow.ToString("o"));
        writer.WriteEndElement();
        writer.WriteString("\n");                
    }

    writer.WriteEndElement();
    string dataOut = sw.ToString();


    Response.Clear();
    Response.ContentType = "text/xml";

    Response.Write(dataOut);
    writer.Close();
    Response.End();
}
public void BindData()
{                    

    StringWriter sw = new StringWriter();
    XmlTextWriter writer = new XmlTextWriter(sw);
    XmlDocument doc = new XmlDocument();
    XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);

    writer.WriteStartElement("feed");
    writer.WriteAttributeString("xmlns", "http://www.w3.org/2005/Atom");
    writer.WriteString("\n");
    writer.WriteElementString("title", this.TTT + " - " + this.Title);
    writer.WriteString("\n");


    writer.WriteStartElement("link");
    writer.WriteAttributeString("href", this.Url );
    writer.WriteEndElement();

    writer.WriteElementString("id", "urn:uuid:" + Guid.NewGuid().ToString());            
    writer.WriteElementString("updated", DateTime.UtcNow.ToString("o"));


    foreach (var  item in this.lista)
    {
        writer.WriteStartElement("entry");
        writer.WriteElementString("title", item.Value.Title);

        writer.WriteStartElement("link");
        writer.WriteAttributeString("href", item.Key);
        writer.WriteEndElement();

        writer.WriteElementString("id", item.Key);
        string slikaImgUrl = item.Value.Imaga;

        if (string.IsNullOrEmpty(slikaImgUrl) == false)
        {
            writer.WriteStartElement("link");
            writer.WriteAttributeString("rel", "enclosure");
            writer.WriteAttributeString("type", "image/jpeg");
            writer.WriteAttributeString("href", slikaImgUrl);
            writer.WriteEndElement();
        }

        writer.WriteStartElement("author");
        writer.WriteElementString("name", this.Title);
        writer.WriteEndElement();

        writer.WriteStartElement("summary");
        writer.WriteAttributeString("type", "text");
        writer.WriteCData(" ");
        writer.WriteEndElement();               

        writer.WriteElementString("updated", DateTime.UtcNow.ToString("o"));
        writer.WriteElementString("published", DateTime.UtcNow.ToString("o"));
        writer.WriteEndElement();
        writer.WriteString("\n");                
    }

    writer.WriteEndElement();
    string dataOut = sw.ToString();


    Response.Clear();
    Response.ContentType = "text/xml";

    Response.Write(dataOut);
    writer.Close();
    Response.End();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文