实现RSS发布

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

借助.NET Framework 3.5ASP.NET MVC框架的支持,在新版本.NET Framework上实现简单的内容发布的RSS是非常容易的。主要完成以下两步工作即可(附代码示例):

1. 生成要发布的内容,在.NET 3.5中可以使用SyndicationItem类表示一条RSS记录,使用SyndicationFeed类来表示并最终生成RSS。这两个类位于System.ServiceModel.Syndication命名空间下,支持生成Atom1.0Rss2.0两种格式的内容。第一步我们来生成SyndicationItem的列表:

首先由数据库查询我们要发布的内容:

var newsObj = DContext.News.OrderByDescending(r => r.ID).Take(num).ToList();

这里使用了Linq to SQL,代码很简单不做解释。接下来生成Rss实体的列表:

List<SyndicationItem> ret = new List<SyndicationItem>();

foreach (var r in newsObj)

{

    var synObj = new SyndicationItem();

 

    synObj.Title = TextSyndicationContent.CreatePlaintextContent(r.Title);

    synObj.Summary = TextSyndicationContent.CreatePlaintextContent(r.Summary);

    synObj.Content = TextSyndicationContent.CreatePlaintextContent(r.Summary);

    synObj.Links.Add(new SyndicationLink(new Uri("http://yourhost/news/newsitem/" + r.ID)));

    synObj.PublishDate = new DateTimeOffset(r.Postdate);

 

    ret.Add(synObj);

}

这个对象下一步将作为SyndicationFeed类构造函数的参数来构建一个SyndicationFeed对象。相关代码会在后文一并展示。

       为了将生成的RSS发布出去,我们实现一个自定义的ActionResult类 – RssResult。这个类中最重要的一个方法就是重写的基类的ExecuteResult方法,其最终将Rss写入到输出流中,闲言少叙直接给出代码:

public class RssResult : ActionResult

{

    private string _title;

    private string _desc;

    private Uri _altLink;

    private List<SyndicationItem> _items;

 

    public RssResult(string title, string desc, string link, List<SyndicationItem> items)

    {

        _title = title;

        _desc = desc;

        _altLink = new Uri(link);

        _items = items;

    }

 

    public override void ExecuteResult(ControllerContext context)

    {

        SyndicationFeed rss = new SyndicationFeed(

            _title,

            _desc,

            _altLink,

            _items

        );

 

        XmlWriterSettings settings = new XmlWriterSettings();

        settings.Indent = true;

        settings.NewLineHandling = NewLineHandling.Entitize;

 

        using (XmlWriter _writer =XmlWriter.Create(context.HttpContext.Response.OutputStream, settings))

        {

            rss.SaveAsAtom10(_writer);

        }

    }

}

通过上面简单的几步我们就完成了Rss的发布。

后续

完成了发布,我们在来了解一下如何很轻松的在Silverlight中实现Rss的获取与显示,当然这也多亏Silverlight Framework中提供的与.NET Framework中一致的SyndicatedFeed类。

首先我们需要获取到RssXml内容,出于安全考虑Silverlight默认不允许跨域访问其它服务器,但往往我们需要的如Rss内容不会与Silverlight运行的机子处于一个域中,这种情况下Silverlight会查找服务器上名为Crossdomain.xml的文件,如果找到则会解析其中的规则,如果Silverlight被允许跨域则可以访问内容,否则会抛出异常。下面的代码中,我们首先使用Silverlight Framework中的WebClientOpenReadAsync方法得到xml

public Page()

{

    InitializeComponent();

    WebClient client = new WebClient();

    Uri uri = new Uri("http://localhost:36360/rss"UriKind.Absolute);

    client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);

    client.OpenReadAsync(uri);

}

对于这个异步请求,我们需要在回调函数中进行处理,我们使用SyndicatedFeed解析(反序列化)Rss内容,并将其绑定到控件上,下面代码的前一部分是我们绑定目标 – ItemControlXAML

<ItemsControl x:Name="_itemTitles">

    <ItemsControl.ItemTemplate>

        <DataTemplate>

            <StackPanel Orientation="Vertical">

                <TextBlock FontWeight="Bold" Text="{Binding Title.Text}" />

            StackPanel>

        DataTemplate>

    ItemsControl.ItemTemplate>

ItemsControl>

接着是回调函数:

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

{

    XmlReader r = XmlReader.Create(e.Result);

    SyndicationFeed feed = SyndicationFeed.Load(r);

    _itemTitles.ItemsSource = feed.Items;

}

代码中粗体部分是与绑定相关的属性。这样我们就在Silverlight中把Rss源的标题以列表形式展示了出来。

 

转载于:https://my.oschina.net/xiahuawuyu/blog/70864

你可能感兴趣的:(实现RSS发布)