Visual Search Provider med Internet Explorer 8

Det er snart et år siden jeg startede på moderskibet, og siden den dag har jeg ikke brugt så langt tid på at få noget så simpelt til at virke som dette stykke kode. Det tog mig ikke langt tid at kode stumperne, men pludselig var der en del krumpstring involveret og noget XML der ikke var korrekt formateret. Jeg spildte en eftermiddag og en weekend nat på dette issue så vær rar læs det hele :0)

Hvis du ikke ved hvad en “Search Provider” er så kig i højre hjørne af Internet Explorer 8:

searhprovider

Det er faktisk ikke bare en fed feature, den er rigtig mega cool!

Personligt er jeg doven når jeg skal søge på internettet, og jeg bryder mig ikke om at bruge ret meget andet end min favorit-søgemaskine til den slags. Men alligevel, så giver disse providers mig mulighed for stadigvæk at være doven, og uden at jeg skal ind på 5 forskellige websites. Hvis jeg vil søge efter bøger skifter jeg bare min provider fra Live til Amazon og vil jeg søge efter nyheder på TV2, ja så….skriver jeg min egen!!!

Det første du skal gøre for at udvikle din egen search provider er, at læse lidt omkring emnet: https://opensearch.org.

Efter du har terpet hele websitet igennem kan du forsigtigt begynde at udforme din helt nye provider.

 <?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="https://a9.com/-/spec/opensearch/1.1/">
 <ShortName>DR Nyheder</ShortName>
 <Image height="16" width="16" type="image/icon">https://dr.dk/favicon.ico</Image>
 <Url type="text/html" template="https://localhost:54125/VisualSearch/DynamicResults.aspx?q={searchTerms}"/>
 <Url type="application/x-suggestions+xml" template="https://localhost:54125/VisualSearch/DynamicResults.aspx?q={searchTerms}&amp;feed=https://www.dr.dk/nyheder/service/feeds/allenyheder&amp;title=DR søgning"/>
</OpenSearchDescription>

Her ser vi OpenSearchDescription dokumentet til vores nye provider. 2 url templates. 1 til når ens søgning skal åbnes i selve browser vinduet, og 1 til når vi skal have forslag med i søge resultatet. Der er 2 muligheder når vi skal have forslag med i vores søge resultat. En er at have forslag som XML, en anden er at have dem som JSON.

Vores forslag til en søgning skal være i dette format:

 <Item>
    <Text>Hej visuelle søgning</Text>
</Item>

<Separator />

Og udenom de Items der nu måtte befinde sig i ens forslagsfil skal der være mere XML. Så i det store hele kommer det ca. til at se således ud.

 <SearchSuggestion xmlns="https://schemas.microsoft.com/Search/2008/suggestions">
    <Query>Den indtastede søgestreng</Query>
    <Section title="Min visuelle søgning">
        <Item>
            <Text>Hej visuelle søgning</Text>
        </Item>
        <Separator />
 </Section>
</SearchSuggestion>

Det er dog lidt for kedelig at have en statisk XML liggende med forslag, så det vil vi selvfølgelig gerne lave dynamisk.

Følgende kode er ikke optimal men ud af frustration over C#’s XML API er dette blevet den endelig løsning.

 protected void Page_Load(object sender, EventArgs e) {
    string queryParam = Request[ "q" ];
    string feed = Request[ "feed" ];
   string searchTitle = Request[ "title" ];
    if (!( String.IsNullOrEmpty( queryParam ) && String.IsNullOrEmpty( feed ) )) {
       XDocument rssFeed = null;
        try {
            rssFeed = XDocument.Load( feed );
        } catch (WebException exp) {
         //log this exception
     }
     if (rssFeed != null) {
           var elements = from feeds in rssFeed.Descendants( "item" )
                        where feeds.Value.Contains( queryParam )
                         select feeds;
          if (elements != null) {
              
             string resultItems = String.Empty;
               int elementsCount = elements.Count();
                int loopIndex = 1;
                foreach (var item in elements) {
                 resultItems += String.Format( "<Item><Text>{0}</Text><Url>{1}</Url><Description>{2}</Description></Item>",
                     item.Element( "title" ).Value, item.Element( "link" ).Value, item.Element( "description" ).Value );
                 if (loopIndex < elementsCount) {
                      resultItems += "<Separator />";
                  } else if (loopIndex == elementsCount) {
                     resultItems += "";
                 }
                    
                 loopIndex++;
             }
             string resultXml =
                       String.Format(
                           @"<SearchSuggestion xmlns=""https://schemas.microsoft.com/Search/2008/suggestions""><Query>{0}</Query><Section title=""{2}"">{1}</Section></SearchSuggestion>",
                         queryParam, resultItems, searchTitle );
               Response.Write( resultXml );
         }
        }
    }
}

Ovenstående er den side der bliver requested når der fortages en søgning. Vi skal huske en sidste ting, og det er nemlig at sætte ContentType til xml.

 <%@ Page Language="C#" ContentType="text/xml" CodeFile="DynamicResults.aspx.cs" Inherits="DynamicResults" %>
<%@ OutputCache Location="None" %>

Mere skal der faktisk ikke til for at lave en search provider til IE8.

God fornøjelse