# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework >  BehooRssGenerator - کتابخانه ای برای تولید آسان RSS

## Behrouz_Rad

BehooRssGenerator کتابخانه ای هست که برای تولید RSS برای سایت هایی که نیاز به RSS دارند نوشتم و تصمیم گرفتم اون رو به صورت عمومی منتشر کنم.

ابزارها و کتابخانه های مختلفی برای تولید RSS وجود دارند. از جمله فضای نام جدید Syndication  که در دات نت NET 3.5. وجود داره و امکان ایجاد RSS و Atom رو با استفاده از WCF یا به شکل مستقل ارائه می کنه.

BehooRssGenerator با #C و کاملا شی گرا نوشته شده، سرعت زیادی در تولید RSS داره، از زبان پارسی پشتیبانی و همچنین دو سطح فشرده سازی "متوسط" و "زیاد" رو عرضه می کنه و کار با اون بسیار راحت هست.
هر سوال یا مشکلی که در رابطه با این کتابخانه دارید در همین تاپیک مطرح بفرمایید.
فایل ضمیمه شامل کتابخانه و نمونه کدی جهت استفاده است.

برای تولید RSS با این کتابخانه، یک صفحه مثلا با نام rss.aspx ایجاد کنید و تمامی محتویات فایل aspx رو به جز دایرکتیو Page که در بالای صفحه وجود داره حذف کنید و سپس کدهای مورد نیاز رو در روال Page_Load بنویسید.

سه نکته:
1) اگر اخبار شما پارسی است، خاصیت Language کلاس RssChannel رو بر روی Persian قرار بدید تا RssReader ها بتونن به صورت راست چین خبرها رو نمایش بدن.
2) حالت فشره سازی رو همیشه بر روی High قرار بدید مگر اینکه تفاوت کمی بین حالت های Medium و High وجود داشته باشه. (این تفاوت رو در Firefox می تونید با راست کلیک بر روی صفحه و انتخاب گزینه ی Page Info و مشاهده ی قسمت Size در سربرگ General مشاهده کنید) در این حالت گزینه ی Medium رو انتخاب کنید.
3) برای یادگیری فرمت فایل های RSS و آشنایی با المنت های این استاندارد مرجع ذیل رو مطالعه بفرمایید:
http://www.rssboard.org/rss-specification

مثالی در رابطه با استفاده از این کتابخانه با #C

using BehooRssGenerator.RssElements;

----------------------------------------------

protected void Page_Load(object sender, EventArgs e)
{
        
    RssChannel OBJ_CHANNEL = new RssChannel("Behrouz News Headlines!", new Uri("http://www.site.com/"), "ASP.NET - Daily News");
    OBJ_CHANNEL.Categories.Add(new RssCategory("Programming"));
    OBJ_CHANNEL.Categories.Add(new RssCategory("Updates", "http://www.site.com/updates"));
    OBJ_CHANNEL.CompressionMode = RssChannel.CompressType.High;
    OBJ_CHANNEL.Copyright = "(c) 2008, Behrouz News Agency.";
    OBJ_CHANNEL.Language = RssLanguages.Persian;
    OBJ_CHANNEL.LastBuildDate = DateTime.Now;
    OBJ_CHANNEL.ManagingEditor = new System.Net.Mail.MailAddress("my1@domain.com", "Ali Ahmadi");
    OBJ_CHANNEL.WebMaster = new System.Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad");

    OBJ_CHANNEL.Items.Add(new RssItem("اولین خبر", new Uri("http://www.site.com/news.aspx?id=1"), "متن خلاصه اولین خبر"));

    RssItem OBJ_ITEM = null;
    OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.site.com/news.aspx?id=2"), "متن خلاصه دومین خبر");
    OBJ_ITEM.Author = new System.Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad");
    OBJ_ITEM.Categories.Add(new RssCategory("Programming"));
    OBJ_ITEM.Comments = new Uri("http://www.site.com/news.aspx?id=2/comments");
    OBJ_ITEM.Guid = new RssGuid(Guid.NewGuid().ToString());
    OBJ_ITEM.PubDate = DateTime.Now.AddHours(-3);

    OBJ_CHANNEL.Items.Add(OBJ_ITEM);

    OBJ_CHANNEL.GenerateRss(this.Context);

}



مثالی در رابطه با استفاده از این کتابخانه با VB.NET

Imports BehooRssGenerator.RssElements

----------------------------------------------

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim OBJ_CHANNEL As New RssChannel("Behrouz News Headlines!", New Uri("http://www.site.com/"), "ASP.NET - Daily News")
    OBJ_CHANNEL.Categories.Add(New RssCategory("Programming"))
    OBJ_CHANNEL.Categories.Add(New RssCategory("Updates", "http://www.site.com/updates"))
    OBJ_CHANNEL.CompressionMode = RssChannel.CompressType.High
    OBJ_CHANNEL.Copyright = "(c) 2008, Behrouz News Agency."
    OBJ_CHANNEL.Language = RssLanguages.Persian
    OBJ_CHANNEL.LastBuildDate = DateTime.Now
    OBJ_CHANNEL.ManagingEditor = New Net.Mail.MailAddress("my1@domain.com", "Ali Ahmadi")
    OBJ_CHANNEL.WebMaster = New Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad")

    OBJ_CHANNEL.Items.Add(New RssItem("اولین خبر", New Uri("http://www.site.com/news.aspx?id=1"), "متن خلاصه اولین خبر"))

    Dim OBJ_ITEM As RssItem = Nothing
    OBJ_ITEM = New RssItem("دومین خبر", New Uri("http://www.site.com/news.aspx?id=2"), "متن خلاصه دومین خبر")
    OBJ_ITEM.Author = New Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad")
    OBJ_ITEM.Categories.Add(New RssCategory("Programming"))
    OBJ_ITEM.Comments = New Uri("http://www.site.com/news.aspx?id=2/comments")
    OBJ_ITEM.Guid = New RssGuid(Guid.NewGuid().ToString())
    OBJ_ITEM.PubDate = DateTime.Now.AddHours(-3)

    OBJ_CHANNEL.Items.Add(OBJ_ITEM)

    OBJ_CHANNEL.GenerateRss(Me.Context)

End Sub

پیاده سازی کتابخانه در MVC و Web Forms متفاوت است. بنابراین برای استفاده در ASP.NET MVC از کتابخانه ای که در فایل ضمیمه ی مرتبط وجود دارد استفاده بفرمایید. برای MVC یک ActionResult سفارشی با نام RssResult وجود دارد که Channel را به عنوان ورودی می گیرد:

return new RssResult(rssChannel);

آپدیت در 18/1/1389: اضافه شدن نسخه ی ASP.NET MVC
موفق باشید.

----------


## Amir Taghavi

من فکر می کنم منظورتون از انتخاب زبان برای RTL کردن صفحه است. آیا این روش در FF هم جواب می ده؟

چون منم یه RSS Generator ساختم و از تگ مربوطه هم استفاده کردم ولی فقط در IE جواب میده!

----------


## Behrouz_Rad

> من فکر می کنم منظورتون از انتخاب زبان برای RTL کردن صفحه است. آیا این روش در FF هم جواب می ده؟


بله دقیقا منظورم همین هست. مختص +IE 7 هست و در Firefox جواب نمیده. تیم توسعه ی Firefox باید برای این موضوع راه حلی رو مبتنی بر RSS ارائه بده.
هر چند پلاگین هایی برای حل این مشکل در Firefox وجود داره.

موفق باشید.

----------


## Behrouz_Rad

به مناسبت تولدم! سورس کدهای این کتابخانه رو تحت لایسنس GPL نسخه ی 2 در سایت CodePlex قرار دادم:
http://www.codeplex.com/behoorss

موفق باشید.  :لبخند:

----------


## mvardin

با سلام
یه مشکل کوچیک در استفاده از لینک
 new Uri("http://site.com") 
دارم ...
تو این حتما http باید گذاشته بشه و نمی شه از عباراتی مثل زیر استفاده کرد:
"site.aspx?id="+id
بنظرتون باید چی کار کنم؟

----------


## mvardin

> هر سوال یا مشکلی که در رابطه با این کتابخانه دارید در همین تاپیک مطرح بفرمایید.


دوستان عزیز کسی نمی دونه چه جوری می تونم این کار رو انجام بدم ( پست قبلی )
اگه نمی شه برم سراغ یه راه حل دیگه ؟

----------


## Behrouz_Rad

تازه سوال شما رو دیدم. چرا از URL کامل استفاده نمی کنی؟

----------


## mvardin

سلام
به فرض از URL کامل استفاده کردم ...
ایجاد

?id="+id

چی ؟
در قسمت URL نمیشه از الحاق دو رشته استفاده کرد ...
میشه یه راهی پیشنهاد کنید تا بشه URLای مثل زیر رو وارد کرد:

"http://site.com/post.aspx?id="*+id*

----------


## Behrouz_Rad

خیلی ساده است دوست من!
سازنده ی Uri یک مقدار رشته ای رو می پذیره. به راحتی می تونی رشته ها رو در پارامتر این سازنده به هم الصاق کنی:

int i = 2;
OBJ_CHANNEL.Items.Add(new RssItem("اولین خبر", new Uri("http://www.site.com/news.aspx?id=" *+ i.ToString()*), "متن خلاصه اولین خبر"));

توجه داشته باش که RSS Reader ها نیاز به URL کامل برای باز کردن لینک Feed دارند و URL ناقص مجاز نیست!

موفق باشید.

----------


## merlin_vista

سلام دوستان : 
من يه مشكل داشتم :
من وقتي با استفاده از اين كامپونت كه آقا بهروز نوشتن ميخواهم RSS را بسازم . وقتي اين لينك را ميدم خطا ميگيره و آر اس اس لود نميشه . 
        OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.domain.com/Default.aspx?action=more&id=15"), "متن خلاصه دومین خبر");

جالب اينحاس كه اگه پارامتر Id را حذف كني كار ميكنه .. يعني اگه فقط يك پارامتر باشه كار ميكنه . ولي من احتياج به دو پارامتر دارم .

پيغام Ie اينه : 
*Internet Explorer cannot display this feed*

----------


## merlin_vista

از دوستان كسي به اين مشكل بر نخورده ... 
آقاي راد ميشه اين باگ را رفع كني ... 

ممنون .....

----------


## Behrouz_Rad

موردی که دوست عزیز، merlin_vista گزارش کرده بود، یک باگ بود که اون رو بر طرف کردم.
نسخه ی جدید رو از پست اصلی دانلود بفرمایید.

----------


## Behrouz_Rad

به نظرت وقتی میشه خودمون به صورت دستی در صفحه ی وب بنویسیم input تا یک دکمه رو تولید کنیم، چرا مایکروسافت اجازه میده تا ما فقط اون را Drag کنیم و روی فرم بندازیم تا این کد خودش بعد از پروسه ای به صفحه اضافه بشه؟

به نظرت وقتی که ما خودمون می تونیم کوکی تصدیق هویت بر روی سیستم کاربر بفرستیم، چرا مایکروسافت سیستم Membership رو ارائه داده؟

به نظرت وقتی ما خودمون می تونیم یه Handler واسه تولید تصاویر امنیتی درست کنیم، چرا باید از CAPTCHA استفاده کنیم؟

اصلاً به نظرت چه دلیلی برای استفاده از کامپوننت در برنامه نویسی وجود داره؟

----------


## SnowBlind

سلام 
من از کتابخانه شما استفاده کردم، واقعا خوب و کامل بود. 2 تا سؤال داشتم:

1) میخواستم ببینم برای ایجاد RSS برای سایت هایی که درخواست های زیادی برای RSS دارند مثل وبلاگ ها (مثلا worpress.com) همین شیوه write کردن روی صفحه مناسب میباشد یا نه؟

2) RSS Reader ها برای مطلع شدن از آپدیت ها چگونه عمل میکنند؟ مثلا در چه بازه زمانی به لینک سر میزنند؟

----------


## Behrouz_Rad

> 1) میخواستم ببینم برای ایجاد RSS برای سایت هایی که درخواست های زیادی برای RSS دارند مثل وبلاگ ها (مثلا worpress.com) همین شیوه write کردن روی صفحه مناسب میباشد یا نه؟


بله مناسبه.



> 2) RSS Reader ها برای مطلع شدن از آپدیت ها چگونه عمل میکنند؟ مثلا در چه بازه زمانی به لینک سر میزنند؟


RSS Reader ها معمولاً از فیلد guid متوجه میشن که اون اخبار جدید هست. فیلد guid هر فید رو برابر با فیلد identity رکورد قرار بدید.
البته اگر guid وجود نداشته باشه، معمولاً از روش های دیگه ای مثل بررسی تاریخ انتشار خبر استفاده می کنند.

موفق باشید.

----------


## SnowBlind

RSSReader فایرفاکس <pubDate> رو نمایش نمیده. در مثالی که همراه سورس دادید این تگ با DateTime.Now.AddHours(-3) پر میشود. که مثلا میشه 12/12/2008 8:47:11 PM. فکر کنم دلیلش این باشه که از rfc822 پیروی نمیکنه. درسته؟

----------


## Behrouz_Rad

اتفاقاً دقیقاً از RFC 822 پشتیبانی میکنه. من سورس های این پروژه رو هم در CodePlex قرار دادم. به R دقت کن:

SB.AppendLine(string.Format("<pubDate>{0:R}</pubDate>", item.PubDate.ToString()));


خروجی این برنامه کاملاً منطبق بر استاندارد RSS هست. در پست اصلی لینک استانداردهای RSS رو گذاشتم.

موفق باشید.

----------


## SnowBlind

درسته حق با شماست، منم بررسی کردم مشکلی تو استاندارد نبود. ولی نمیدونم چرا firefox RSSReader تگ <pubDate> رو نمایش نمیده!!!  
شما خودت با firefox تست کردی؟

----------


## Behrouz_Rad

یا تشکر از شما.
مشکل در نحوه ی عجیب برخورد دات نت با سویچ R بود. دات نت با سویچ R در حالتی که در پارامتر اول متد Format کلاس String استفاده بشه برخورد اشتباهی داره! بنابراین باید سویچ R یا r رو به متد ToString پاس داد.
نسخه ی آپدیت شده رو از پست اصلی دانلود بفرمایید.

موفق باشید.

----------


## SnowBlind

آره فقط R نیست سوییچ های دیگه رو هم اعمال نمیکنه!!!!

من به صورت زیر تغییرش دادم و مشکل حل شد:
SB.AppendLine(string.Format("<pubDate>{0}</pubDate>", this.PubDate.ToString("R", DateTimeFormatInfo.InvariantInfo)));

----------


## mojniknam

من اینو دانلود کردم و توی پوشه تست رفتم و برنامه رو اجرا کردم
ولی ارور میده



> Line 49:             ASP.NET to identify an incoming user. 
> Line 50:         -->
> Line 51:         <authentication mode="Windows" />
> Line 52:         <!--
> Line 53:             The <customErrors> section enables configuration

----------


## hobab-theme

سلام آقا بهروز عزیز
ببخشید که یه سوال مسخره میپرسم
ولی میخوام بدونم که ما باید تمام لینکها و توضیحات و ... رو دستی وارد کنیم؟
آیا نمیشه کاری کرد که این برنامه خودش هوشمند لینکها و توضیحات و ... رو ایجاد کنه؟
ممنون

----------


## محمدامین شریفی

خسته نباشید آقای راد.
آیا این RSS Generator از خواصیت podcast هم پشتیبانی می کند؟
همانطور که دوستان گفتند،اگر بصورت خودکار تولید RSS بکند،بهتر است.
خوشحالم که در دنیای رقابتی،تجاری امروز،کسی هم به فکر زبان پارسی است.

----------


## si6arp

> سلام دوستان : 
> من يه مشكل داشتم :
> من وقتي با استفاده از اين كامپونت كه آقا بهروز نوشتن ميخواهم RSS را بسازم . وقتي اين لينك را ميدم خطا ميگيره و آر اس اس لود نميشه . 
>         OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.domain.com/Default.aspx?action=more&id=15"), "متن خلاصه دومین خبر");
> 
> جالب اينحاس كه اگه پارامتر Id را حذف كني كار ميكنه .. يعني اگه فقط يك پارامتر باشه كار ميكنه . ولي من احتياج به دو پارامتر دارم .
> 
> پيغام Ie اينه : 
> *Internet Explorer cannot display this feed*


تا اونجایی که عقل ناقص من میگه نمیشه از یک سری کاراکتر ها استفاده کرد مقل همین : &
شما باید به جای "&" از "&amp;" استفاده کنید تا مشکل برطرف بشه . باز هم اگه نشد بگید تا یه راه دیگه واسش پیدا کنیم :دی

----------


## fakhravari

با سلام 
ممنون از اقای راد 
چنتا سوال اولیه هم دوستان کرده بودن در مورد لینک هایی که بیشتر از 1 پارانتر داشت .
من هم همین مشکل دارم یعنی من به صورت زیر استفاده میکنم.
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                string link = "http://www.fakhravary.somee.com/Show/Display_PostID.aspx?TopicID=" + dt.Rows[i]["TopicID"] + "&Subject=" + dt.Rows[i]["Subject"] + "";
                OBJ_CHANNEL.Items.Add(new RssItem(dt.Rows[i]["Subject"].ToString(), new Uri(link), dt.Rows[i]["Message"].ToString()));
            }
زمانی که با 1 پارمتر باشه مشکلی نیست اما زمانی که پارامتر 2 "&Subject=" وارد میشه برنامه خطا میگیره یعنی چیزی نمایش نمیده.

----------


## Behrouz_Rad

> با سلام 
> ممنون از اقای راد 
> چنتا سوال اولیه هم دوستان کرده بودن در مورد لینک هایی که بیشتر از 1 پارانتر داشت .
> من هم همین مشکل دارم یعنی من به صورت زیر استفاده میکنم.
>             for (int i = 0; i < dt.Rows.Count; i++)
>             {
>                 string link = "http://www.fakhravary.somee.com/Show/Display_PostID.aspx?TopicID=" + dt.Rows[i]["TopicID"] + "&Subject=" + dt.Rows[i]["Subject"] + "";
>                 OBJ_CHANNEL.Items.Add(new RssItem(dt.Rows[i]["Subject"].ToString(), new Uri(link), dt.Rows[i]["Message"].ToString()));
>             }
> زمانی که با 1 پارمتر باشه مشکلی نیست اما زمانی که پارامتر 2 "&Subject=" وارد میشه برنامه خطا میگیره یعنی چیزی نمایش نمیده.


 من با چند پارامتر تست کردم اما مشکلی ندیدم.
فایل ضمیمه رو بررسی کنید.

----------


## fakhravari

خیلی جالب بود.
چون کاریشم نکردم ولی تست کدم کار داد .
    protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        ds.ReadXml(Server.MapPath("File.xml"));
        DataTable dt = ds.Tables[0].Copy();

        RssChannel OBJ_CHANNEL = new RssChannel("site", new Uri("http://www.site.com/"), "best");
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            OBJ_CHANNEL.Items.Add(new RssItem(dt.Rows[i]["Subject"].ToString(), new Uri("http://www.fakhravary.somee.com/Show/Display_PostID.aspx?TopicID=" + dt.Rows[i]["TopicID"] + "&Subject=" + dt.Rows[i]["Subject"] + ""), dt.Rows[i]["Message"].ToString()));
        }
        OBJ_CHANNEL.GenerateRss(this.Context);
    }

----------


## fakhravari

با سلام
پست اخر تصحیح میکنم تا پست دیگری نزنم.
در سوالات بالا فکر کنم من  کمی dll دستکاری کرده بودم که در اتصالات لینک خطا به وجود میومد .
دوباره کلاس برسی کردم و بدون مشکل کار کرد. :لبخند گشاده!:

----------


## fakhravari

با سپاس از اقای راد.
اینم چنا نمونه RSS
https://github.com/keyvan/PodcastRssGenerator4DotNet/
https://github.com/keyvan/PodcastRss...ive/master.zip
http://www.30sharp.com/article/2/344...D8%AA-rss.aspx

----------


## fakhravari

اقای راد در نمونه شما چطوری میتونم عکس وارد کنم؟

----------


## hlikehamed

سلام
من از کتابخانه شما و چند نمونه دیگه برای تولید RSS استفاده می کنم ولی در همه اونها گاهی به جای نمایش صحیح RSS پیغام زیر نمایش داده میشه و به صورت xml صفحه لود میشه

*This XML file does not appear to have any style information associated with it. The document tree is shown below.*


مشکل از چیست ؟

----------


## hlikehamed

تا اونجایی که من متوجه شدن خطای زیر وقتی اتفاق میافته که commresionmode رو روی medium قرار بدیم. اما یه مشکل دیگه ای که باهاش برخورد می کنم اینه وقتی مود رو روی High قرار میدم باز هم گاهی با پیغام زیر مواجه میشم :
*
Content Encoding Error

          The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.

  Please contact the website owners to inform them of this problem*.






> سلام
> من از کتابخانه شما و چند نمونه دیگه برای تولید RSS استفاده می کنم ولی در همه اونها گاهی به جای نمایش صحیح RSS پیغام زیر نمایش داده میشه و به صورت xml صفحه لود میشه
> 
> *This XML file does not appear to have any style information associated with it. The document tree is shown below.*
> 
> 
> مشکل از چیست ؟

----------


## fakhravari

با چه تگی عکس اضافه کنم؟ :لبخند:

----------


## komeil64

من می خواستم با تگimage کار کنم اما آدرس قبول نمی کنه!
OBJ_CHANNEL.Image.URL

----------


## fakhravari

اقای راد در مورد عکس توضیح میدید

----------


## komeil64

من خیلی به این مورد نیاز دارم کسی می تونه کمک کنه؟

----------

