FriendlyUrl ASP.NET Handler

Eigentlich ärgere ich mich gerade über LinkedIn. Genauer gesagt über den Social Image Preview der gecached wird, wenn man einen Post erstellt. Dazu nutze ich nun einen ASHX Handler der ein passendes Bild auf Zuruf zur jeweiligen Unterseite generiert.

In einer HTML (oder hier Webforms) Page muss per og:image auf ein Bild verwiesen werden. Bei mir jetzt

<meta property="og:image" 
content="/LinkedinOgImageHandler/<%=Request.QueryString("sedetid") %>">

Erst hatte ich den ASHX Handler per Querystring mit den Parametern versorgt. Das Internet meint, man müsse LinkedIn eine wechselnde Url vorgaukeln, wie das per Friendly URL umgesetzt ist.
Ich habe für den folgenden Code einfach die RouteConfig.vb genutzt.
Zuerst die Klasse für den Handler

   1:  Public Class LinkedinOgImageHandler : Implements IHttpHandler
   2:      Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
   3:          ' Parameter aus Querystring lese
   4:          Dim sedetid As Integer = HttpContext.Current.Items("ImageId")
   5:   ....
   6:          ' Bildgröße LinkedIn Optimal
   7:          Dim width As Integer = 1200
   8:          Dim height As Integer = 627
   9:   
  10:          ' Farben aus https://ppedv.de extrahiert
  11:          Dim bgColor As Color = ColorTranslator.FromHtml("#009FE3") ' Blau
  12:          Dim textColor As Color = Color.White
  13:   
  14:          ' Bild erzeugen
  15:          Using bmp As New Bitmap(width, height)
  16:              Using graphics As Graphics = graphics.FromImage(bmp)
  17:                  graphics.Clear(bgColor)
  18:   
  19:                  ' Schriftarten definieren
  20:                  Dim titelFont As New Font("Arial", 48, FontStyle.Bold)
  21:                  Dim detailFont As New Font("Arial", 32, FontStyle.Regular)
  22:   
  23:                  ' Text zeichnen
  24:                  graphics.DrawString(titel, titelFont, New SolidBrush(textColor), New RectangleF(50, 150, width - 100, 150))
  25:                  graphics.DrawString($"Format {format}", detailFont, New SolidBrush(textColor), New PointF(50, 350))
  26:                  graphics.DrawString($"Start {start}", detailFont, New SolidBrush(textColor), New PointF(50, 420))
  27:   
  28:                  ' Output festlegen
  29:                  context.Response.ContentType = "image/png"
  30:                  bmp.Save(context.Response.OutputStream, ImageFormat.Png)
  31:              End Using
  32:          End Using
  33:      End Sub

Wie man hier sieht, habe ich keinen direkten Zugriff auf das Url Segment, sondern benutze das Items Dictionary auf dem HttpContext.

Dann lege ich eine Route an, die den Parameter abgreift und einer weiteren Klasse, dem Handler übergibt.

  Sub RegisterRoutes(ByVal routes As RouteCollection)
           routes.Add("LinkedinOgImageHandlerRoute",
New Route("LinkedinOgImageHandler/{id}", New CustomRouteHandler()))

 

Im Handler kommt der Parameter an und wird temporär in der Requestpipline des IIS gespeichert. Also Items im HttpContext.

   1:  Public Class CustomRouteHandler
   2:      Implements IRouteHandler
   3:   
   4:      Public Function GetHttpHandler(ByVal requestContext As RequestContext) 
As IHttpHandler Implements IRouteHandler.GetHttpHandler
   5:          Dim id As String = requestContext.RouteData.Values("id").ToString()
   6:          HttpContext.Current.Items("ImageId") = id
   7:   
   8:          Return New LinkedinOgImageHandler()
   9:      End Function


Leider leider reicht das in meinem Fall noch nicht, weil die aufrufende URL noch per Querystring Parameter funktioniert. Aber das ist eine andere Geschichte.

Kommentare sind geschlossen