在asp.net页面中使用异步读取


有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。

  要求:论坛需要提供RSS支持。

  代码如下:

#region task class
  //这是一个任务类,执行具体的任务
  public class RssAsyncTask
  {
    private String _rssContent;
    private AsyncTaskDelegate _dlgt;
    private string rssUrl;
    private bool _success;
  
    public bool IsSuccess
    {
      get
      {
        return _success;
      }
    }
  
    public RssAsyncTask(string rssUrl)
    {
      this.rssUrl = rssUrl;
    }
  
    // Create delegate.
    protected delegate void AsyncTaskDelegate();
  
    public String GetRssContent()
    {
      return _rssContent;
    }
    public void DoTheAsyncTask()
    {
      // Introduce an artificial delay to simulate a delayed
      // asynchronous task. Make this greater than the
      // AsyncTimeout property.
      WebClient wc = new WebClient();
      try
      {
        _rssContent = wc.DownloadString(rssUrl);
        _success = true;
      }
      catch (Exception e)
      {
        _rssContent = e.Message;
      }
      finally
      {
        wc.Dispose();
      }
      //Thread.Sleep(TimeSpan.FromSeconds(5.0));
    }
  
    // Define the method that will get called to
    // start the asynchronous task.
    public IAsyncResult OnBegin(object sender, EventArgs e,
      AsyncCallback cb, object extraData)
    {
      //_rssContent = "Beginning async task.";
  
      _dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
      IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);
  
      return result;
    }
  
    // Define the method that will get called when
    // the asynchronous task is ended.
    public void OnEnd(IAsyncResult ar)
    {
      //_rssContent = "Asynchronous task completed.";
      _dlgt.EndInvoke(ar);
    }
  
    // Define the method that will get called if the task
    // is not completed within the asynchronous timeout interval.
    public void OnTimeout(IAsyncResult ar)
    {
      _rssContent = "Ansynchronous task failed to complete " +
        "because it exceeded the AsyncTimeout parameter.";
    }
  }
  #endregion
 //一个自定义的控件,继承自另一个自定义控件。

public class RArticle
    : LPanel
  {
    #region properties
    string rssUrl;
  
    public string RssUrl
    {
      get { return rssUrl; }
      set { rssUrl = value; }
    }
  
    int maxRecordNumber = 6;
  
    public int MaxRecordNumber
    {
      get { return maxRecordNumber; }
      set { maxRecordNumber = value; }
    }
    #endregion
  
    RssAsyncTask task;
    protected override void OnInit(EventArgs e)
    {
      base.OnInit(e);
      task = new RssAsyncTask(this.rssUrl);
      PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null);
  
      Page.RegisterAsyncTask(asyncTask);
      Page.ExecuteRegisteredAsyncTasks();
    }
  
    static Random r = new Random();
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
      string rssContent = task.GetRssContent();
      XmlDocument doc = null;
      if (task.IsSuccess)
      {
        doc = new XmlDocument();
        doc.LoadXml(rssContent);
  
        this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;
        this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
        this.ShowTitle = true;
      }
      base.RenderBegin(writer);
  
      writer.WriteBeginTag("div");
      writer.WriteAttribute("class", "child2");
      Right(writer);
      writer.WriteBeginTag("ul");
      Right(writer);
  
      if (doc != null)
      {
        #region success
  
        XmlNodeList items = doc.SelectNodes("rss/channel/item");
        List<XmlNode> nodes = new List<XmlNode>();
        foreach (XmlNode node in items)
          nodes.Add(node);
  
        //使用范型进行日期的倒序排列
        nodes.Sort(new Comparison<XmlNode>(delegate(XmlNode n1, XmlNode n2)
        {
          DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
          DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
          TimeSpan ts = d2 - d1;
          return (int)ts.TotalSeconds;
        }));
  
        for (int i = 0; i < maxRecordNumber; i++)
        {
          XmlNode node = nodes[i];
          writer.WriteBeginTag("li");
          Right(writer);
          writer.WriteBeginTag("a");
          writer.WriteAttribute("target", "_blank");
          writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
          Right(writer);
          writer.Write(node.SelectSingleNode("title").InnerText);
          writer.WriteEndTag("a");
          writer.WriteEndTag("li");
        }
  
        #endregion
      }
      else
      {
        writer.WriteBeginTag("pre");
        Right(writer);
        writer.Write(task.GetRssContent());
        writer.WriteEndTag("pre");
      }
  
      writer.WriteEndTag("ul");
      writer.WriteEndTag("div");
  
      RenderChildren(writer);
  
      base.RenderEnd(writer);
    }
  }


  使用方法:

  一、注册控件

  <%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>

  二、调用

  <lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl="http://bbs.5inet.net/rss.aspx" />

  为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3