Code Snippet
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.Reflection;
namespace LitwareWebParts
{
public class RssViewWebPart : WebPart, IWebEditable
{
private Stream xmlResponseStream = null;
private WebRequest xmlReq;
public enum RenderMode
{
Full,
Titles
}
private string xmlUrl;
[Personalizable(PersonalizationScope.Shared), WebBrowsable(false),
WebDisplayName("Feed Url"), WebDescription("Set your RSS feed's XML URL here!"),
System.ComponentModel.Category("Configuration")]
public string XmlUrl
{
get { return xmlUrl; }
set { xmlUrl = value; }
}
private RenderMode headlineMode = RenderMode.Full;
[Personalizable(PersonalizationScope.User), WebBrowsable(false),
WebDisplayName("Headline Mode"), WebDescription("Do you want to only display headlines "),
System.ComponentModel.Category("Configuration")]
public RenderMode HeadlineMode
{
get { return headlineMode; }
set { headlineMode = value; }
}
public override EditorPartCollection CreateEditorParts()
{
List<EditorPart> editorParts = new List<EditorPart>(1);
EditorPart part = new RssViewEditorPart();
part.ID = this.ID + "_rssViewEditor";
editorParts.Add(part);
EditorPartCollection baseParts = base.CreateEditorParts();
return new EditorPartCollection(baseParts, editorParts);
}
// Book page 116
// xmlUrl and RenderMOde properties omitted for clarity
// Handle any prerender tasks including async operation initiation
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (string.IsNullOrEmpty(this.xmlUrl))
return;
//Check to see if we're in design mode and if so skip request
if (this.WebPartManager.DisplayMode.AllowPageDesign)
{
this.Controls.Add(new LiteralControl("No display while in design mode. "));
return;
}
try
{
Uri xmlUri = new Uri(this.xmlUrl);
xmlReq = WebRequest.CreateDefault(xmlUri);
xmlReq.Credentials = CredentialCache.DefaultCredentials;
xmlReq.Timeout = 10000; // 10 Secs timeout
this.Page.RegisterAsyncTask(
new PageAsyncTask(new BeginEventHandler(BeginXmlRequest),
new EndEventHandler(EndXmlRequest), new EndEventHandler(XmlRequestTimeout),
null, true)
);
}
catch (System.Security.SecurityException)
{
this.Controls.Add(
new LiteralControl("Permission denied - set trust level to WSS_Medium."));
}
}
IAsyncResult BeginXmlRequest(object src, EventArgs args, AsyncCallback callback, object state)
{
return this.xmlReq.BeginGetResponse(callback, state);
}
void XmlRequestTimeout(IAsyncResult ar)
{
Label timeoutLabel = new Label();
timeoutLabel.Text = string.Format("The request time out while waiting for {0}.", this.XmlUrl);
this.Controls.Add(timeoutLabel);
}
void EndXmlRequest(IAsyncResult ar)
{
WebResponse response = this.xmlReq.EndGetResponse (ar);
this.xmlResponseStream = response.GetResponseStream();
}
protected override void RenderContents(HtmlTextWriter writer)
{
base.RenderContents(writer);
if (string.IsNullOrEmpty(this.xmlUrl) || this.xmlResponseStream == null)
return;
XslCompiledTransform transform = new XslCompiledTransform();
string xslt;
if (this.HeadlineMode == RenderMode.Full)
xslt = @"Resources.RSS.xslt";
else
xslt = @"Resources.RssTitles.xslt";
string resourceName = @"LitwareWebParts" + xslt;
using (Stream res = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
using (XmlTextReader stylesheet = new XmlTextReader(res))
{
transform.Load(stylesheet);
}
}
try {
using (XmlReader reader = new XmlTextReader(this.xmlResponseStream)){
XmlTextWriter results = new XmlTextWriter(writer.InnerWriter);
transform.Transform(reader, results);
reader.Close();
}
}
catch (Exception ex ){
writer.Write(ex.Message);
if (this.xmlResponseStream != null ){
this.xmlResponseStream.Close();
this.xmlResponseStream.Dispose();
}
}
}
}
}