用Asp.net產生RSS檔案,以便Rss閱讀器訂閱。
環境如下:
A:資料庫環境:
SQLServer2005(資料庫執行個體:機器名+SQLServer2005)
B:開發環境
Vs2005.net
資料庫
Create table Tb_Test(ID int identity(1,1),Title varchar(20), Description varchar(100), AddDate datetime default(getdate()))
go
insert into tb_test(Title,Description)
select '中國新聞','新華社網公司'
union all
select '中央新聞','中央電視台'
union all
select '國際新聞','國際廣播'
union all
select '環球新聞','環球廣播'
union all
select '鳳凰新聞','鳳凰衛視'
go
Web.config
<?xml version="1.0"?>
<!--
注意: 除了手動編輯此檔案以外,您還可以使用
Web 管理工具來配置應用程式的設定。可以使用 Visual Studio 中的
“網站”->“Asp.Net 配置”選項。
設定和注釋的完整列表在
machine.config.comments 中,該檔案通常位於
WindowsMicrosoft.NetFrameworkv2.xConfig 中
-->
<configuration>
<appSettings>
<add key="Db_cfgConn" value="server=.SQLSERVER2005;database=Test_DB;uid=sa;pwd=ylwtsmt"/>
</appSettings>
<connectionStrings/>
<system.web>
<!--
設定 compilation debug="true" 將偵錯符號插入
已編譯的頁面中。但由於這會
影響效能,因此只在開發過程中將此值
設定為 true。
-->
<compilation debug="true"/>
<!--
通過 <authentication> 節可以配置 ASP.NET 使用的
安全身分識別驗證模式,
以標識傳入的使用者。
-->
<authentication mode="Windows"/>
<!--
如果在執行請求的過程中出現未處理的錯誤,
則通過 <customErrors> 節可以配置相應的處理步驟。具體說來,
開發人員通過該節可以配置
要顯示的 html 錯誤頁
以代替錯誤堆疊追蹤。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
VS.net 代碼:
GetRSS類代碼:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
public class GetRss
{
/// <summary>
/// 根據檔案路徑寫RSS檔案
/// </summary>
/// <remarks>
/// 例如:
/// WriteRss("D:Vs2005GenerateRssRSS_Folder est_tb.xml","test_tb")
/// 注意:根據表的結構,需要調整產生的RSS源。本執行個體僅供測試用。
/// </remarks>
/// <param name="pathfilename">檔案路徑</param>
/// <param name="tablename">表名</param>
/// <returns>true or false</returns>
public static bool WriteRss(string pathfilename,string tablename)
{
try
{
FileInfo finfo = new FileInfo(pathfilename);
using (FileStream fs = finfo.OpenWrite())
{
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8"));
sw.WriteLine(GetRss.GetRSSString(tablename));
sw.Flush();
sw.Close();
}
return true;
}
catch (System.Exception ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
return false;
throw;
}
}
/// <summary>
/// 組織符合最新標準的RSS字串
/// 參數:表名。
/// </summary>
/// <remarks>
/// 例如:
/// GetRSS()
/// 注意:根據表的結構,需要調整產生的RSS源。本執行個體僅供測試用。
/// </remarks>
/// <param name="tablename">表名</param>
/// <returns>返回一個DataSet 資料來源</returns>
public static string GetRSSString(string Tablename)
{
try
{
DataSet ds = GetRSSData(Tablename);
string strRSS = "";
strRSS = strRSS + " <?xml version="1.0"?> " + System.Environment.NewLine;
strRSS = strRSS + " <rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"" + System.Environment.NewLine;
strRSS = strRSS + " xmlns:xsd="http://www.w3.org/2001/XMLSchema" " + System.Environment.NewLine;
strRSS = strRSS + " xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">" + System.Environment.NewLine;
strRSS = strRSS + " <channel>" + System.Environment.NewLine;
strRSS = strRSS + " <title>訂閱標題</title> " + System.Environment.NewLine;
strRSS = strRSS + " <link>http://www.**com.cn/</link>" + System.Environment.NewLine;
strRSS = strRSS + " <description>描述資訊</description>" + System.Environment.NewLine;
strRSS = strRSS + " <language>zh-CN</language>" + System.Environment.NewLine;
strRSS = strRSS + " <generator>www.**com.cn</generator> " + System.Environment.NewLine;
strRSS = strRSS + " <copyright>北京**公司</copyright> " + System.Environment.NewLine;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
strRSS = strRSS + " <item>" + System.Environment.NewLine;
strRSS = strRSS + " <title>" + ds.Tables[0].Rows[i]["Title"] + "</title> " + System.Environment.NewLine;
strRSS = strRSS + " <link>http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html</link> " + System.Environment.NewLine;
strRSS = strRSS + " <author /> " + System.Environment.NewLine;
strRSS = strRSS + " <guid>http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html</guid> " + System.Environment.NewLine;
strRSS = strRSS + " <pubDate>" + Convert.ToDateTime(ds.Tables[0].Rows[i]["AddDate"].ToString()).ToString("yyyy-MM-dd HH:mm") + "</pubDate> " + System.Environment.NewLine;
strRSS = strRSS + " <comments>http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html</comments> " + System.Environment.NewLine;
strRSS = strRSS + " <slash:comments>0</slash:comments> " + System.Environment.NewLine;
strRSS = strRSS + " <source url="http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html">" + ds.Tables[0].Rows[i]["Title"] + " </source> " + System.Environment.NewLine;
strRSS = strRSS + " <description>" + ds.Tables[0].Rows[i]["Description"] + "</description>" + System.Environment.NewLine;
strRSS = strRSS + " </item>" + System.Environment.NewLine;
}
strRSS = strRSS + " </channel>" + System.Environment.NewLine;
strRSS = strRSS + " </rss>" + System.Environment.NewLine;
return strRSS;
}
catch (Exception ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
throw;
}
}
/// <summary>
/// 擷取RSS資料來源
/// 參數:表名。
/// </summary>
/// <remarks>
/// 例如:
/// DataSet ds = GetRSSData(TableName)
/// 注意:根據表的結構,需要調整產生的RSS源。本執行個體僅供測試用。
/// </remarks>
/// <param name="Tablename">表名</param>
/// <returns>返回一個DataSet 資料來源</returns>
public static DataSet GetRSSData(string Tablename)
{
String DBConnStr = System.Configuration.ConfigurationManager.AppSettings["Db_cfgConn"];
System.Data.SqlClient.SqlDataAdapter DataAdapter = new System.Data.SqlClient.SqlDataAdapter();
System.Data.SqlClient.SqlConnection Connection = new System.Data.SqlClient.SqlConnection(DBConnStr);
if (Connection.State != ConnectionState.Open)
{
Connection.Open();
}
try
{
System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand("SELECT @COLUMNS=@COLUMNS+','+NAME FROM SYS.COLUMNS WHERE OBJECT_ID=OBJECT_ID(@TABLENAME) ORDER BY column_id SET @COLUMNS='SELECT '+STUFF(@COLUMNS,1,1,'')+' FROM '+@TABLENAME+'' EXEC(@COLUMNS) ", Connection);
Command.CommandType = CommandType.Text;
Command.Parameters.Add("@TABLENAME", SqlDbType.VarChar, 20);
Command.Parameters["@TABLENAME"].Value = Tablename;
Command.Parameters.Add("@COLUMNS", SqlDbType.VarChar, 2000);
Command.Parameters["@COLUMNS"].Value = "";
Command.ExecuteNonQuery();
DataAdapter.SelectCommand = Command;
DataSet DataSet = new DataSet();
if (DataSet != null)
{
DataAdapter.Fill(DataSet, "table");
}
return DataSet;
}
catch (System.Exception ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
Connection.Close();
throw;
}
}
}
前台代碼(注意:html頁面無其它html代碼)
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string Tablename = "Tb_Test"; //Request.QueryString["TableName"];
string fname = System.Web.HttpContext.Current.Server.MapPath("RSS_Folder") + "\" + Tablename + ".XML";
GetRss.WriteRss(fname, Tablename);
}
}
該代碼可以在當前程式下的(RSS_Folder)目錄下產生以表命名的Xml檔案。
以後可以在其它RSS閱讀器中訂閱RSS服務了。(包括Foxmail 6.0支援對RSS訂閱)