如何从其他博客中检索博客/网站最近的帖子

时间:2014-04-06 17:29:54

标签: c# asp.net .net blogger

如何从其他博客中检索博客/网站最近的帖子 比如http://www.indiblogger.in

从任何网站或博客获取最近的帖子并将其存储到我的数据库中... 如何在asp.net c#

中实现这一点

1 个答案:

答案 0 :(得分:2)

回答你问题的方法是:

  1. 检索供稿
  2. 创建数据库上下文
    1. 创建实体类
    2. 创建DbSet
  3. 将订阅源添加到DbSet
  4. 创建网页
    1. 添加GridView和Button
    2. 在codebehind中添加代码
  5. 检索供稿

    根据您的链接,第一步是找到我们可以找到哪些帖子,以便我们检索这些帖子。饲料网由饲料燃烧器提供 接下来,我们使用SyndicationFeed的Load方法。该方法接受XmlReader,但遗憾的是rssfeed中使用的Date格式未被理解,所以我们必须使用helper provided by Micorosft:

    XmlReader Helper

        class MyXmlReader : XmlTextReader
        {
            private bool readingDate = false;
            const string CustomUtcDateTimeFormat = "ddd MMM dd HH:mm:ss Z yyyy"; // Wed Oct 07 08:00:07 GMT 2009
    
            public MyXmlReader(Stream s) : base(s) { }
    
            public MyXmlReader(string inputUri) : base(inputUri) { }
    
            public override void ReadStartElement()
            {
                if (string.Equals(base.NamespaceURI, string.Empty, StringComparison.InvariantCultureIgnoreCase) &&
                    (string.Equals(base.LocalName, "lastBuildDate", StringComparison.InvariantCultureIgnoreCase) ||
                    string.Equals(base.LocalName, "pubDate", StringComparison.InvariantCultureIgnoreCase)))
                {
                    readingDate = true;
                }
                base.ReadStartElement();
            }
    
            public override void ReadEndElement()
            {
                if (readingDate)
                {
                    readingDate = false;
                }
                base.ReadEndElement();
            }
    
            public override string ReadString()
            {
                if (readingDate)
                {
                    string dateString = base.ReadString();
                    DateTime dt;
                    if(!DateTime.TryParse(dateString,out dt))
                        dt = DateTime.ParseExact(dateString, CustomUtcDateTimeFormat, CultureInfo.InvariantCulture);
                    return dt.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture);
                }
                else
                {
                    return base.ReadString();
                }
            }
        }
    

    的FeedReader

    SyndicationFeed LoadFeed()
    {
        return SyndicationFeed.Load(
         new MyXmlReader(@"http://feeds.feedburner.com/indiblogger?format=xml")
          );
    }
    

    数据库

    对于database use EntityFramework 6(使用Nuget进行安装)

    对于codefirst方法,为Posts

    创建一个DbContext派生类和一个属性
    class BlogContext:DbContext
    {
        public DbSet<Post> Posts { get; set; } 
    }
    

    用于保存帖子数据的课程。

    public class Post
    {
        public int Id {get; set;}
        public string Body { get; set;}
    }
    

    主要功能

    合并数据馈送的负载和数据库存储。迭代feed.Items,从项目数据创建一个Post并将每个Post添加到DataContext上的Posts集合。不要忘记调用SaveChanges将所有内容存储在数据库中。

    public void LoadFeedAndStore()
    {
       var feed = LoadFeed();
       var db = new BlogContext();
    
        foreach(var item in feed.Items)
        {
           db.Posts.Add(
            new Post { 
                Body = item.Summary == null ? "<empty>":  item.Summary.Text 
                });
        }
        db.SaveChanges();
    }
    

    在asp.net页面

    中显示

    要显示网页中的帖子,请将Posts集合的结果绑定到gridvew

    页面中的标记

    <%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
        CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    </asp:Content>
    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
        <asp:GridView ID="GridView1" runat="server" OnLoad="Grid_Load" >
        </asp:GridView>
        <asp:Button ID="Button1" runat="server" Text="Load Feed" OnClick="Button1_Click"/>
    </asp:Content>
    

    代码背后

    我们再次使用BlogContext并调用Posts上的ToList()以获取Post对象的数据可绑定列表。 GridView具有在html页面中呈现此列表的所有知识。

    protected void Grid_Load(object sender, EventArgs e)
    {
        var db = new BlogContext();
        GridView1.DataSource = db.Posts.ToList();
        GridView1.DataBind();
    }
    

    如果单击该按钮,我们会在数据库中加载Feed:

    protected void Button1_Click(object sender, EventArgs e)
    {
        LoadFeedAndStore();
    }