• home
    • news & events
    • blog
  • über uns
    • projekte und referenzen
    • partner
    • produkte & technologien
    • offene jobs / stellen
    • veröffentlichungen
  • dienstleistungen & services
    • software design & architektur
    • software entwicklung
    • beratung / consulting
    • training, kurse und workshops
  • angebote
    • quick-starts
    • trainings und kurse
    • modulare sharepoint 2010 workshops
  • kontakt
Wir bieten SharePoint und .NET
Kompetenz, Erfahrung und Know-How:
"1stQuad guaranteed."
Diesen Blog abonnieren
Subscribe in NewsGator Online Add to My AOL
Add to Google Reader or Homepage Add to netvibes

Aktuelle Posts

Quick-Tipp: Publishing Site Settings
Update: Dynamisches Wiki Inhaltsverzeichnis
Chart Part für SharePoint 2010
SharePoint Content DB Migration -> Access denied
Konfigurieren von „Gefällt mir“ und Kategorien und Notizen

Archiv

Januar 2012 (4)
Dezember 2011 (2)
November 2011 (10)
September 2011 (3)
August 2011 (7)
Juli 2011 (1)
Juni 2011 (3)
Mai 2011 (6)
April 2011 (5)
März 2011 (8)
Februar 2011 (8)
Januar 2011 (4)
Dezember 2010 (5)
November 2010 (7)
September 2010 (6)
August 2010 (2)
Juli 2010 (11)
Juni 2010 (13)
Mai 2010 (11)
April 2010 (4)
März 2010 (6)
Februar 2010 (2)
Januar 2010 (6)
Dezember 2009 (4)
November 2009 (13)
Oktober 2009 (17)
September 2009 (2)
Juli 2009 (2)
März 2009 (2)
Januar 2009 (1)

1stQuad ist Microsoft Certified Gold Partner und bietet SharePoint und .NET Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad ist MatchPoint Partner und bietet MatchPoint Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad ist Nintex Partner und bietet Nintext SharePoint Workflows Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad ist Balesio Gold Partner und bietet SharePoint FILEMinimizer Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad Solutions ist Kentico Certified Solution Partner und bietet Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
© 2011 1stQuad Solutions
Alle Rechte vorbehalten
> Impressum
Wir bieten Microsoft SharePoint und .NET Projekt- und Produkt-Know-how, Kompetenz und Erfahrung für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Zürich, Bern, Basel, Schweiz sowie Deutschland und Östereich.

Blog > Oktober 2009

SharePoint Variations: HttpHandler anstatt VariationsRootLanding

Wenn die SharePoint Variations gebraucht werden um Inhalte in verschiedenen Sprachen bereit zu stellen, erstellt SharePoint eine Umleitungs-Seite, welche den Redirect von der Startseite auf die entsprechende Sprachversion macht. Leider hat dieser Mechanismus 2 gravierende Nachteile: Er ist sehr langsam und gibt zudem noch den falschen Http-Status-Code zurück. Dieser Beitrag zeigt, wie man das Problem mit einem HttpHandler einfach lösen kann.

Veröffentlicht am 13.10.2009 07:48:10 von Michael Hofer mit 0 Kommentar(en)

Wenn die SharePoint Variations verwendet werden, so wird meistens auch die Standard SharePoint-Logik verwendet um den Redirect von der "LandingPage", d.h. der zentralen Einstiegs-Seite unter z.B. http://meineSharePointSite auf http://meineSharePointSite/deutsch/ usw. zu machen. Leider hat sich dies als alles andere als performant herausgestellt - und sendet zudem noch den falschen Http-Status Code zurück:

  • 302: Temporarely Removed, anstelle von
  • 301: Permanently Removed
Gerade für Internet-Seiten, welche gut indexiert werden sollten ist dies alles andere als fördernd.

Hinter den Kulissen passiert folgendes: Wenn die Variations-Hierarchien angelegt werden erstellt SharePoint eine neue Publishing-Seite mit dem PageLayout "Variations Root Page" und machte diese zur "Welcome Page", d.h. der Startseite der obersten Ebene der Website (respektive eben in der Ebene wo die Variations beginnen). Dieses PageLayout beinhaltet ein Control VariationsRootLanding.ascx, welches im 12er-Hive zu finden ist: 12\TEMPLATE\CONTROLTEMPLATES. Dieses Web-User-Control beinhaltet die Logik, welche feststellt, auf welche Sprach-Version/Variation der Benutzer umgeleitet werden soll. Der eigentliche Redirect findet dann mittels SPUtility.Redirect(targetUrl, SPRedirectFlags.Default, Context) im Page_Load Ereignis statt. Freundlicherweise hat Microsoft hier die gesamte Logik im Quell-Code der Datei eingepflegt und nicht in eine DLL-Kompiliert.

Nun könnten wir ja hingehen und diese Datei anpassen um sicherzustellen, dass der richtige HTML-Statuscode zurückgegeben wird. Allerdings ist dies nicht zu empfehlen, denn immerhin handelt es sich hier ja um eine SharePoint System-Datei und die könnte von einem Update oder Service-Pack überschrieben werden, von der Mühe, sich alle Anpassungen zu merken ganz zu schweigen...

Wie ich aber in verschiedenen Messungen feststellen konnte, sind Aufrufe auf die Standard Variations-Redirect-Seite enorm langsam. Dies ist dadurch erklärbar, dass die Seite wie eine normale Publishing-/Veröffentlichungsseite gehandhabt wird und auch einen beträchtlichen Teil des Lebenszyklus durchalufen muss, bevor dann endlich im Page_Load Ereignis die Umleitung stattfindet.

Deshalb setzte ich heute vielfach einen eigenen Http-Handler für die Redirects ein, also eine Klasse, welche IHttpHandler implementiert. Das Vorgehen ist denkbar einfach:
  • Ein neues Visual Studio Projekt erstellen und das Projekt wenn nötig/gewollt mit einem "Strong-Name" versehen (GAC Deployment)
  • Eine Klasse "VariationsRedirectHandler" erstellen, welche System.Web.IHttpHandler implementiert.
  • Die Logik von Microsoft aus  VariationsRootLanding.ascx übernehmen und ergänzen, so dass der richtige Status-Code ausgegeben wird (hier darf nicht SPUtility.Redirect verwendet werden!). Natürlich kann hier auch eine eigene Logik implementiert werden!
  • Die Assembly kompilieren und deployen
Alles, was uns jetzt noch fehlt ist ein Eintrag im Web.Config um den Http-Handler einzuschalten:

<httpHandlers>
      <remove verb="GET,HEAD,POST" path="*" />
      <add verb="*" path="/" type="FirstQuad.SharePoint.Publishing.VariationsRedirecttHttpHandler, FirstQuad.SharePoint.Publishing, Version=2.7.0.0, Culture=neutral, PublicKeyToken=9f4da00116xxxxxx" />
...
 </httpHandlers>


Dies funktioniert dann, wenn die Variations auf der obersten Ebene angelegt worden sind. Möchte man, dass der Handler auf einer anderen Ebene aktiv wird, ist die Sache etwas komplizierter: Man muss zwei Pfade registrieren:
  • path="/myPath", und
  • path="/myPath/"

Dies ist aber dann auch schon alles: Wir haben nun eine schnelle Umleitung, welche den richtigen Status-Code zurückgibt.

Im Folgenden noch ein Code-Beispiel/Auszug, wie ich den Code des Page_Load Ereignisses in die Methode ProcessRequest des IHttpHandlers übernommen habe:

public void ProcessRequest(HttpContext context)
{
    string targetUrl = this.GetRedirectTargetUrl();
    if (!string.IsNullOrEmpty(targetUrl))
    {
     Redirect(context.Response, 301, "/" + targetLocale.TwoLetterISOLanguageName);
    }
}


Die Methode Redirect habe ich von Nick Berardi's Coder Journal übernommen:

public static void Redirect(this HttpResponse response, int type, string url)  
{   
    response.Clear();   
  
    switch (type)   
    {   
        case 301:   
            response.StatusCode = (int)HttpStatusCode.MovedPermanently;   
            response.StatusDescription = "Moved Permanently";   
            break;   
  
        case 302:   
            response.StatusCode = (int)HttpStatusCode.Found;   
            response.StatusDescription = "Found";   
            break;   
  
        case 303:   
            response.StatusCode = (int)HttpStatusCode.SeeOther;   
            response.StatusDescription = "See Other";   
            break;   
  
        case 304:   
            response.StatusCode = (int)HttpStatusCode.NotModified;   
            response.StatusDescription = "Not Modified";   
            break;   
  
        case 307:   
            response.StatusCode = (int)HttpStatusCode.TemporaryRedirect;   
            response.StatusDescription = "Temporary Redirect";   
            break;   
  
        default:   
            goto case 302;   
    }   
  
    response.RedirectLocation = url;   
  
    response.ContentType = "text/html";   
    response.Write("<html><head><title>Object Moved</title></head><body>");   
    response.Write("<h2>Object moved to <a href=\"" + HttpUtility.HtmlAttributeEncode(url) + "\">here</a>.</h2>");   
    response.Write("</body></html>");   
  
    response.End();  
} 


Hinweis: Der Code ist zu umfangreich und auch spezialisiert für das Projekt um ihn gänzlich in diesem Blog zu publizieren. Ich gebe aber gerne weitere Auskünfte und auch Code-Fragemente auf Anfrage ab.




 

Kommentar
Dieser Blog-Eintrag wurde noch nicht kommentiert.
Kommentar hinterlassen



 Security code
Zurück, Seite drucken