Jag har en RSS-fil som fungerar bra. När man surfar till den (http://www.dileno.com/rss.aspx) så visas tiderna då nyheterna skrevs korrekt. Men när jag lägger till RSS-feeden i exempelvis Thunderbird eller NewsGator (plugin till Outlook) så visar tiden +2 h. Vad kan problemet vara?
Lägger jag in information om CultureInfo så kommer väl tiden att visas fel i rss.aspx när man surfar till den? (eller??)
Tack på förhand! codebehind:
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Text
Imports System.Text.Encoding
Imports Microsoft.VisualBasic
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.Page
Imports System.Xml
public class rss : inherits Page
sub page_load(sender as object, e as eventargs)
'sätter teckenkodningen
response.ContentType="text/xml"
response.ContentEncoding = Encoding.UTF8
'skapar nödvändiga objekt
dim sw as StringWriter = new StringWriter()
dim rw as XmlTextWriter = new XmlTextWriter(sw)
'skriv ut <rss version="2.0">
rw.WriteStartElement("rss")
rw.WriteAttributeString("version","2.0")
'skriv ut <channel>
rw.WriteStartElement("channel")
'skriv ut element som tillhör <channel>
rw.WriteElementString("title","Dileno.com")
rw.WriteElementString("link","http://www.dileno.com/")
rw.WriteElementString("description","Dileno - en sajt som fokuserar på intervjuer, artiklar och foto.")
rw.WriteElementString("language","sv-se")
rw.WriteElementString("copyright","Copyright 2001-2005 Dileno")
'plocka ut info från databas för att skriva ut i RSS-filen
dim SQL as string = "SELECT top 15 id,title,art_text,dt FROM tbl_articles WHERE category=1 ORDER BY id DESC"
dim Cn as new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" & Server.MapPath("db__.mdb"))
dim Cm as new OleDbCommand(SQL,Cn)
dim dbRead as OleDbDataReader
Cn.Open()
dbRead = Cm.ExecuteReader()
'loopa genom innehållet som ska plockas ut
while dbRead.Read()
'skriv ut <item> och dess innehåll
rw.WriteStartElement("item")
rw.WriteElementString("title",dbRead.Item(1))
rw.WriteElementString("link","http://www.dileno.com/default.aspx?CatId=4" & "&ArtId=" & dbRead.Item(0))
rw.WriteElementString("description",replace(dbRead.Item(2),vbcrlf,"<br />"))
rw.WriteElementString("pubDate",cDate(dbRead.Item(3)).tostring("r"))
rw.WriteEndElement()
end while
dbRead.Close()
'skriv ut </channel>
rw.WriteEndElement()
'skriv ut </rss>
rw.WriteEndElement()
rw.Close()
response.write(sw.toString())
end sub
end class
renholmMedlem sedan apr. 20012 266 inlägg Satsar på att det har något med tidszoner att göra, om du skriver in en nyhet här i Sverige klockan 12:00 bör din RSS visa 10:00 GMT, detta eftersom vi under sommartiden är två timmar plus sett från GMT tiden. Visar den i stället 12:00 GMT får du problem då klienten försöker omvandla detta till lokaltid, denna blir då 14:00.
Angående själva koden ovan, skulle du kunna göra det lite snyggare genom att använda en IHttpHandler och sedan skriva direkt till OutputStream i stället för att först skapa en sträng och sedan skriva ut strängen. Typ så här:
dim rw as XmlTextWriter = new XmlTextWriter(Response.OutputStream)
Kan du ge ett mer konkret exempel på användande av Response.OutputStream och IHttpHandler, renholm? :)
Mitt datumproblem löste jag genom att i stället för toString("r") skriva toString("F") när jag skulle formatera datumet. I stället för "Tue, 08 Feb 2005 22:12:36 GMT" så blev det "den 8 februari 2005 22:12:36" vilket är mycket bättre.. ;)
renholmMedlem sedan apr. 20012 266 inlägg Snyggaste sättet torde väl vara att konvertera med XmlConvert.ToString(); då antar jag att du får ut standardformatet för tid, inklusive rätt tidszoner.
Här är ett exempel på RSS, dock utan url:
public class RssHandler : System.Web.IHttpHandler
{
#region IHttpHandler Members
public void ProcessRequest(System.Web.HttpContext context)
{
Category category = Category.GetByID(int.Parse(context.Request["categoryId"]));
NewsCollection newslist = NewsCollection.GetPublishedNews(category.ID);
context.Response.ContentType = "text/xml";
XmlTextWriter writer = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8);
writer.Formatting = System.Xml.Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("rss");
writer.WriteStartElement("channel");
writer.WriteStartElement("title");
writer.WriteString(category.Name);
writer.WriteEndElement();
foreach(News news in newslist)
{
writer.WriteStartElement("item");
writer.WriteStartElement("title");
writer.WriteString(news.Title);
writer.WriteEndElement();
writer.WriteStartElement("pubDate");
writer.WriteString(XmlConvert.ToString(news.DateTime));
writer.WriteEndElement();
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
}
public bool IsReusable
{
get { return false; }
}
#endregion
public RssHandler()
{
}
}
Outout blir så här:
<rss>
<channel>
<title>Esports</title>
<item>
<title>Nyhet</title>
<pubDate>2005-04-24T15:04:18.0000000+02:00</pubDate>
</item>
</channel>
</rss>
Well - jag försökte mig på Renholms kodexempel men det går inte speciellt bra. Den klagar på att den inte hittar HandlerX:
File or assembly name HandlerX, or one of its dependencies, was not found.
Kod, rss.vb:
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Text
Imports System.Text.Encoding
Imports Microsoft.VisualBasic
Imports System.Web
Imports System.Web.HttpContext
Imports System.Xml
namespace HandlerX
public class RssHandler : Implements IHttpHandler
public sub ProcessRequest(context as HttpContext) Implements IHttpHandler.ProcessRequest
'sätter teckenkodningen
context.response.ContentType="text/xml"
'skapar nödvändiga objekt
dim rw as XmlTextWriter = new XmlTextWriter(context.response.OutPutStream, Encoding.UTF8)
'skriv ut <rss version="2.0">
rw.WriteStartElement("rss")
rw.WriteAttributeString("version","2.0")
'skriv ut <channel>
rw.WriteStartElement("channel")
'skriv ut element som tillhör <channel>
rw.WriteElementString("title","Dileno.com")
rw.WriteElementString("link","http://www.dileno.com/")
rw.WriteElementString("description","Dileno - en sajt som fokuserar på intervjuer, artiklar och foto.")
rw.WriteElementString("language","sv-se")
rw.WriteElementString("copyright","Copyright (c) 2001-2005 Dileno")
'plocka ut info från databas för att skriva ut i RSS-filen
dim SQL as string = "SELECT top 15 id,title,art_text,dt FROM tbl_articles WHERE category=1 ORDER BY id DESC"
dim Cn as new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" & HttpContext.Current.Server.MapPath("dbms/db_articles.mdb"))
dim Cm as new OleDbCommand(SQL,Cn)
dim dbRead as OleDbDataReader
Cn.Open()
dbRead = Cm.ExecuteReader()
'loopa genom innehållet som ska plockas ut
while dbRead.Read()
'skriv ut <item> och dess innehåll
rw.WriteStartElement("item")
rw.WriteElementString("title",dbRead.Item(1))
rw.WriteElementString("link","http://www.dileno.com/default.aspx?CatId=4" & "&ArtId=" & dbRead.Item(0))
rw.WriteElementString("description",replace(dbRead.Item(2),vbcrlf,"<br />"))
rw.WriteElementString("pubDate",cDate(dbRead.Item(3)).toString("F"))
rw.WriteEndElement()
end while
dbRead.Close()
'skriv ut </channel>
rw.WriteEndElement()
'skriv ut </rss>
rw.WriteEndElement()
rw.Flush()
end sub
'överskugga the isreuseable property
public readonly property IsReUseable() as boolean Implements IHttpHandler.IsReusable
get
return false
end get
end property
end class
end namespace
web.config ser ut så här:
<configuration>
<system.web>
<customErrors mode="Off" />
<httpHandlers>
<add verb="*" path="rss.aspx" type="HandlerX.RssHandler,HandlerX"/>
</httpHandlers>
</system.web>
</configuration>
Hur ska HandlerX och klassen RssHandler hittas? Jag har lagt rss.vb i roten på servern, liksom web.config.
renholmMedlem sedan apr. 20012 266 inlägg Vad har du angivit för assembly för ditt projekt i VS?
renholmMedlem sedan apr. 20012 266 inlägg Kolla under properties för ditt projekt
Jag har inte skapat nåt projekt, och det går inte att skapa projekt heller. MÅSTE man verkligen skapa ett projekt för att detta ska fungera? Borde man väl inte behöva..?
renholmMedlem sedan apr. 20012 266 inlägg Vet inte vad felet beror på men det går att kompilera via vbc.exe, vad jag vet måste en HttpHandler kompileras.
Hur görs det sedan när man lägger upp det hela på en publik server, jag sitter ju lokalt och testar nu? Måste den kompilerar på servern också?
renholmMedlem sedan apr. 20012 266 inlägg Nix, på servern laddar du bara upp din .dll-fil, som du fick efter kompileringen, till /bin.
Tack, then I know. Återkommer efter att jag testat kompileringen.