Da un po’ di tempo, per eseguire le ricerca all’interno di un sito Web, sto utilizzando Lucene.NET. Per creare l’indice neccessario ad eseguire la ricerca utilizzo un file .xml che viene generato automaticamente per permettere ai motori di ricerca di indicizzare il sito Web (vedi post).
Il codice è molto semplice: viene creato un XmlTextReader che legge il file .xml alla ricerca dei nodi contenenti l’indirizzo delle pagine del sito che bisogna indicizzare; ogni volta che trova una pagina viene scaricato il contenuto ed aggiunto all’indice. (vedi codice):
public void AddSiteMapAxd(String indirizzo)
{
XmlTextReader reader = new XmlTextReader(indirizzo);
bool flag = false;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
if (reader.Name == "loc")
{ flag = true; }
else
{ flag = false; }
break;
case XmlNodeType.Text: //Display the text in each element.
if (flag)
{ AddHtmlDocument(reader.Value); }
break;
case XmlNodeType.EndElement: //Display the end of the element.
break;
}
}
reader.Close();
}
Il problema nasce quando il sito che si sta cercando di indicizzare aumenta le proprie dimensioni. L’oggetto XmlTextReader, infatti, è connesso al WebServer durante la lettura del file xml. Inoltre l’XmlTextReader ha un timeout per la connessione remota che non può essere modificato (o almeno io non ci sono riuscito). Quando si cerca di fare il parsing di un sito di medie dimensioni, quindi, la connessione con il WebServer viene interrotta e di conseguenza anche la creazione dell’indice generando un errore in fase di esecuzione
.
La soluzione che ho adottato è molto semplice: consiste nello scaricare il contenuto del file .xml all’interno di un file locale utilizzando un WebClient. Successivamente viene creato un XmlTextReader che fa riferimento al file .xml in locale. In questo modo non esiste nessuna connessione remota e quindi non c’è nemmeno il pericolo del timeout. (vedi codice)
public void AddSiteMapAxd(String indirizzo)
{
WebClient downloadSiteMap = new WebClient();
FileInfo file = new FileInfo(docRootDirectory + @"\mappaSito.xml");
downloadSiteMap.DownloadFile(indirizzo, file.FullName);
XmlTextReader reader = new XmlTextReader(file.OpenRead());
bool flag = false;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
if (reader.Name == "loc")
{ flag = true; }
else
{ flag = false; }
break;
case XmlNodeType.Text: //Display the text in each element.
if (flag)
{ AddHtmlDocument(reader.Value); }
break;
case XmlNodeType.EndElement: //Display the end of the element.
break;
}
}
reader.Close();
file.Delete();
}
Non so se la soluzione trovata sia la migliore possibile, ma, almeno per il momento, funziona. Intanto sono ben accetti suggerimenti.
Ciao by MADIL a presto
.