Implementare OpenSearch sul proprio sito

Nel weekend scorso ho deciso di implementare l’OpenSearch all’interno del mio blog in modo da offrire un servizio in più ed imparare una cosa nuova. In pratica lo scopo era di creare un provider di ricerca per i principali browser di navigazione come Internet Explorer, Firefox e Chrome. L’implementazione è piuttosto banale: basta creare un HttpHandler - o un file statico nel caso in cui le informazioni non necessitino di una gestione dinamica - contenente un set d’informazioni in formato XML, aggiungere il link a tale risorsa nell’header della pagina, ed il gioco è fatto; il browser penserà poi a recuperare in automatico le informazioni e a “proporvi” il provider di ricerca da aggiungere. Il codice dell’HttpHandler è veramente banale e lo potete vedere qui di seguito:

[csharp] public class OpenSearchHandler : HttpHandlerBase { private readonly ISiteConfigurationService siteConfigurationService; private readonly IUrlBuilderService urlBuilder;

public OpenSearchHandler ()
{
    siteConfigurationService = IoC.Resolve<ISiteConfigurationService> ();
    urlBuilder = IoC.Resolve<IUrlBuilderService> ();
}

public OpenSearchHandler ( ISiteConfigurationService siteConfigurationService , IUrlBuilderService urlBuilder )
{
    this.siteConfigurationService = siteConfigurationService;
    this.urlBuilder = urlBuilder;
}

public override void ProcessRequest ( HttpContextBase context )
{
    SiteConfigurationDTO configuration = siteConfigurationService.GetConfiguration ();

    StringBuilder sb = new StringBuilder ( "<OpenSearchDescription xmlns=\"http://a9.com/-/spec/opensearch/1.1/\"> " );
    sb.AppendFormat ( "<ShortName>{0}</ShortName>" , configuration.BlogName );
    sb.AppendFormat ( "<Description>{0}</Description>" , configuration.SeoConfiguration.DefaultDescription );
    sb.AppendFormat ( "<Image height=\"16\" width=\"16\" type=\"image/vnd.microsoft.icon\">{0}{1}</Image>" , urlBuilder.SiteWithHttp () , "Images/favicon.ico" );
    sb.AppendFormat("<Url type=\"text/html\" template=\"{0}blog/search?q={1}\" /> ", urlBuilder.SiteWithHttp(), "{searchTerms}");
    sb.AppendFormat("<Url type=\"application/rss+xml\" template=\"{0}blog/search?q={1}\" /> ", urlBuilder.SiteWithHttp(), "{searchTerms}");
    sb.Append ( "</OpenSearchDescription>" );

    context.Response.ContentEncoding = Encoding.UTF8;
    AddHeaders ( "text/xml" , 30 , sb.GetHashCode () );

    context.Response.Write ( sb.ToString () );
}

} [/csharp]

Mentre per quanto riguarda l’header della pagina html, è sufficiente inserire il seguente markup html: [xml]<link type="application/opensearchdescription+xml" rel="search" title="Il blog di ugo lattanzi" href="/opensearch.axd"/>[/xml] A questo punto il risultato dovrebbe essere più o meno quello riportato negli screenshot seguenti:

Internet Explorer:

imageimageimage

FireFox:

imageimageimage

Nota: Chi fosse interessato può esporre anche il suggest nella ricerca, restituendo un set di informazioni in formato json (vedi qui).

Ciauz


Comments