Get Client Ip mit Blazor Cascading Parameters

Ich halte Blazor Kurse. Für Cascading Parameter hat mir bis eben ein sinnvoller Anwendungsfall gefehlt. Für Cascading Parameter fehlte mir bis eben ein nachvollziehbarer Anwendungsfall um eine Teilnehmer Übung zu gestalten.

Da kommt eine Schwäche von Blazor gerade  recht. Da Blazor Server Side per SignalR kommunziert fehlt der Zugriff auf den HttpContext. So kann man aus Blazor nicht den User Agent oder die Client IP Adresse auslesen. Zumindest nicht direkt. Natürlich kann man JavaScript nutzen, möchte aber nicht.

Wenn man sich ein wenig mit den Basics von der darunter liegenden Technologie, ASP.NET auskennt, ist die Lösung ganz einfach. Der Aufruf der _hosts.cshtml basiert auf ganz normalen core MVC. Diese Seite wird immer aufgerufen, bevor Blazor startet. Ein guter Einstiegspunkt um dann per Parameter das Blazor App Taghelper Objekt mit der IP Adresse zu füttern.

   1:    <component type="typeof(App)" 
   2:  render-mode="ServerPrerendered" 
   3:  param-ip="Request.HttpContext.Connection.RemoteIpAddress.ToString()"/>

Die Blazor App beginnt ihr Leben in der Datep App.razor. Der Parameter wird als Property mit identen Namen aus param-ip ohne Präfix deklariert. Wie üblich mit der Annotation Parameter. Um den vorhanden Router Code wird das Cascading Value Element gelegt. Ein Cascading Value ist ein Parameter der von jeder weiteren Client Component wieder ausgelesen werden kann. Der Parameter ip wird per Value Attribut weiter gereicht.

   1:  <CascadingValue Value="ip">
   2:  <Router AppAssembly="@typeof(Program).Assembly">
   3:      ...
   4:  </Router>
   5:  </CascadingValue>
   6:  @code
   7:  {
   8:        [Parameter]
   9:      public string ip { get; set; }
  10:  }

Fehlt noch eine Blazor Page, die den Wert des Parameters wieder auslesen will. Ein C# Property versehen mit dem Methodenattribut CascadingParameter und identen Namen.

   1:  @ip
   2:   
   3:  @code {
   4:  [CascadingParameter]
   5:      private string ip { get; set; }
   6:  }

Wer das lokal laufen lässt erhält eine IP ala localhost :::1.

Kommentare sind geschlossen