webForumDet fria alternativet

Datum i RSS-fil - visar 2 timmar fel

.NETur .NET

12 svar · 748 visningar · startad av m_soderlund

m_soderlundMedlem sedan sep. 20026 425 inlägg
#1

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
#2

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)
m_soderlundMedlem sedan sep. 20026 425 inlägg
#3

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
#4

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>
m_soderlundMedlem sedan sep. 20026 425 inlägg
#5

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
#6

Vad har du angivit för assembly för ditt projekt i VS?

m_soderlundMedlem sedan sep. 20026 425 inlägg
#7

Ingen..?!

renholmMedlem sedan apr. 20012 266 inlägg
#8

Kolla under properties för ditt projekt

m_soderlundMedlem sedan sep. 20026 425 inlägg
#9

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..?

mde_error.gif
renholmMedlem sedan apr. 20012 266 inlägg
#10

Vet inte vad felet beror på men det går att kompilera via vbc.exe, vad jag vet måste en HttpHandler kompileras.

m_soderlundMedlem sedan sep. 20026 425 inlägg
#11

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
#12

Nix, på servern laddar du bara upp din .dll-fil, som du fick efter kompileringen, till /bin.

m_soderlundMedlem sedan sep. 20026 425 inlägg
#13

Tack, then I know. Återkommer efter att jag testat kompileringen.

141 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)