HttpContext in .NET Core nutzen

In vielen Fällen ist der Zugriff auf den HttpContext notwendig, sei es nur, um an die aktuellen Benutzerinformationen zu gelangen.

Dies gestaltet sich in einem Controller sehr einfach, da diese Basisklasse den HttpContext über eine Eigenschaft nach außen gibt.

public class DemoController : Controller
{
    [HttpPut]
    public IActionResult Put([FromBody] Audit audit)
    {
        ClaimsPrincipal principal = this.HttpContext.User;

        if (principal.HasClaim(c => c.Type == "id"))
        {
            audit.ChangedBy = principal.Claims.First(c => c.Type == "userName").Value;
        }
        else
        {
            return BadRequest("error message");
        }

        // code goes here

        return Ok();
    }
}

Nun kann man diverse Aufgaben in eigenen Komponenten ausführen. Dort ist der HTTP-Kontext nicht verfügbar. Wie kann nun darauf zugegriffen werden?

Die Lösung besteht in der Verwendung des Schnittstelle IHttpContextAccessor in Verbindung mit der Dependency Injection, die .NET Core bietet:

public void ConfigureServices(IServiceCollection services) 
{
    // configuration goes here

    services.AddHttpContextAccessor();
}

Bei Nutzung der Dependency Injection wird die Abhängigkeit nun bei Klassen, die das Interface IHttpContextAccssor als Konstruktor-Parameter erwarten, übergeben.

public class Auditor
{
    private IHttpContextAccessor ContextAccessor { get; set; }

    public Auditor(IHttpContextAccessor httpContextAccessor) 
    {
        ContextAccessor = httpContextAccessor;
    }

    public void WriteAudit(T oldEntity, T newEntity) 
    {
        var user = ContextAccessor.HttpContext.User;

        // code goes here
    }
}

Diese Klasse muss natürlich noch beim Dependendy System registriert werden:

public void ConfigureServices(IServiceCollection services) 
{
    // configuration goes here

    services.AddHttpContextAccessor();

    services.AddTransient<Auditor>();
}

Happy Coding.

Du willst mehr zu .NET Core erfahren? Hier lang.

.NET Core: Eigenschaft nicht serialisieren

Ausgangspunkt: Du überträgst Daten von deiner API an den Client. Dabei werden Daten übertragen, die der Client nicht benötigt oder – aus anderen Gründen – nicht an ihn übergeben werden sollen. Dafür gibt es zwei Ansätze:

DataContract

Markiere eine Klasse mit dem DataContractAttribute. Nun werden nur Attribute serialisiert, welche durch das Attribut DataMemberAttribute markiert wurden.

[DataContract]
public class User
{
    [DataMember]
    public string UserName { get; set; }

    public string Password { get; set; }
}

In diesem Fall wird nur die Eigenschaft UserName serialisiert und an an den Client übertragen. Password wird dabei ignoriert.

IgnoreDataMember

Die zweite Variante besteht in der Verwendung des Attributs IgnoreDataMemberAttribute. Hier wird die Klasse nicht mit DataContract markiert und alle Attribute serialisiert, ausser, wenn sie mit dem IgnoreDataMemberAttribute ausgenommen werden.

public class User
{
    public string UserName { get; set; }

    [IgnoreDataMember]
    public string Password { get; set; }
}

Sobald eine Klasse mit DataContract markiert ist, wird das IgnoreDataMemberAttribute ignoriert.

.NET Core: Wiederkehrende Aufgaben im Hintergrund ausführen

In vielen Anwendungen gibt es die Notwendigkeit, bestimmte Aufgaben in regelmäßigen Zeitintervallen auszuführen. .NET Core bietet hierfür eine einfache Möglichkeit an.

IHostedService

Die Schnittstelle IHostedService stellt dem Entwickler die Möglichkeit bereit, einen Dienst zu implementieren, der einmal im Dependency System registriert, über die gesamte Laufzeit lebt und eine Aufgaben ausführen kann. Sie steht seit .NET Core 2.1 zur Verfügung.

Mit folgender Implementierung kann ein Job realisiert werden, der alle fünf Minuten ausgeführt wird:

public class MyImportJob : IHostedService, IDisposable
{
    private ILogger<MyImportJob> Logger { get; }
    private Timer _timer;

    public MyImportJob(ILogger<MyImportJob> logger)
    {
        Logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        Logger.LogInformation("Starting Job [" + nameof(NormalizedUserCheckJob) + "]");

        _timer = new Timer(Check, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));

        return Task.CompletedTask;
    }

    private void Check(object state)
    {
        Logger.LogInformation("Running [" + nameof(MyImportJob) + "]");

        // Do job here
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        Logger.LogInformation("Stopping Job [" + nameof(MyImportJob) + "]");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

Nun fehlt noch die Registrierung.

Registrierung

Schlussendlich muss eine Registrierung erfolgen. Dies geschieht in Startup.ConfigureServices:

services.AddHostedService<MyImportJob>();

Mehr ist nicht notwendig und der Job wird ab Start des Hosts alle fünf Minuten ausgeführt.

Fazit

Wiederkehrende Aufgaben können sehr einfach über die Schnittstelle IHostedService implementiert und ausgeführt werden. .NET Core stellt die notwendige Infrastruktur zur Verfügung. Als Softwareentwickler können wir uns voll und ganz auf die Funktionalität konzentrieren.

So ist auch Twitter wieder nutzbar

Alexander Zeitler hat heute einen dahintümpelnden Gedanken wach gerüttelt, der sich zusehends im Gehirn breit macht und sogar unbewusst zu einigen Handlungen in den letzten Wochen geführt hat. Dabei geht es hauptsächlich um das hohe Grundrauschen aka Noice, dem wir auf Twitter mittlerweile ausgesetzt sind. Das hat mich bewegt, etwas zu ändern. Geschafft hat er das mit dem Retweet dieses Tweets:

Following 0

Wer mir auf Twitter folgt und auch öfter mit mir interagiert hat, hat sicher gemerkt, dass ich mich auch hier mittlerweile nur mehr selten blicken lasse. Microsoft-Gebashe hier, Apple-Gebashe dort, sinnlose Suderei darüber, was wo alles nicht funktioniert.

Destruktives Gehabe, das man sich unnötigerweise selbst angewöhnt. Das zieht Energie, die besser eingesetzt werden kann. Das brauch und will ich nicht mehr.

Und doch gibt es so viele interessante und hilfreiche Informationen auf Twitter. Diese möchte ich natürlich lesen und gerne auch an sinnvollen Diskussionen teilhaben. Damit das aber funktioniert, muss ich die Verwendung von Twitter ändern. Vom passiven User werde ich zum aktiven und gestalte meine “Timeline” nun selbst.

Following 0 | Twitter | Norbert Eder

Ich folge niemandem mehr. Auch meinen besten Freunden nicht. Stattdessen setze ich auf andere Möglichkeiten.

Listen

Listen verwende ich schon lange. Halbherzig. Da ich niemandem mehr direkt folge, habe ich die interessanten Accounts in Listen kategorisiert, der Rest wurde nicht mehr berücksichtigt. Meine Timeline ist leer (außer den eigenen Tweets) und ich lese, worauf ich gerade Lust habe. Ob die eingesetzten Listen so passen, wie sie sind, wird sich zeigen. Aktuell habe ich 9 Listen.

Gespeicherte Suchen

Horizonterweiterung. Neue interessante Hinweise, Artikel und Diskussionen von mir unbekannten Accounts finde ich per Keyword-Suche. Accounts, die positiv auffallen, werden in meine Listen übernommen.

Zu meinen Interessen finde ich so viele tolle Informationen.

Geblockte Keywords

Listen setzen auf Accounts und dort wird manchmal über Themen getweetet, die mich nicht interessieren oder über die ich nicht informiert werden möchte. Mittlerweile blocke ich diese Keywords und habe meine Ruhe. Super, um unnötige Aufregungen – und Rauschen im Allgemeinen – zu vermeiden. Ein laufendes Anpassen muss wohl sein, da sich natürlich Interessen ändern, oder aber manche Themen dann möglicherweise dann doch wieder interessant werden.

Fazit

Mit diesen Maßnahmen lässt sich Twitter wieder wunderbar für Informations- und Erkenntnisgewinn, aber auch interessanten Gesprächen, nutzen. Der Rest bleibt außen vor – und das ist auch gut so.

Ziele 2019

Wie jedes Jahr, nehme ich mir auch für das kommende Jahr wieder einige Ziele vor. Einige davon möchte ich hiermit öffentlich zugänglich machen, einige werden alleine nur für mich (bzw. für einen nicht-öffentlichen Kontext) existieren.

Softwareentwicklung

Das kommende Jahr wird sich voraussichtlich um die Themen .NET Core, Golang, Container, Serverless und IoT drehen. Es stehen einige große Projekte ins Haus. Hierzu wird viel architekturelle aber auch sicherheitsrelevante Arbeit zu leisten sein. Die Ziele liegen hierbei weniger bei den einzelnen Technologien, sondern vielmehr in der Größenordnung und damit einhergehenden architekturellen und performancetechnischen Herausforderungen.

Bewertbares Ziel: Mehr Fachbeiträge hier im Blog als 2018.

Fotografie

Ich war 2018 sehr viel unterwegs und es sind tolle Fotos entstanden. Allerdings fand ich nicht die Muse, diese auch online zu präsentieren. 2019 möchte ich mehr in meine Portfolios investieren und sie aufmotzen. Auch soll es wieder meine Reiseberichte geben.

Nachdem ich bereits im “Portrait-Modus” bin, werde ich anschließen und mehr in dieses Thema investieren.

Neben der Fotografie möchte ich mich auch mit dem Thema Video mehr beschäftigen. In diesen Bereich fallen viele andere Themen wie Sound, Bearbeitungssoftware usw. Meinen Weg möchte ich dokumentieren und somit einen Einblick in dieses Thema liefern.

Auch zum Thema Bildbearbeitung wird es einige Tutorials geben. Dabei werde ich mich mit der Software Luminar auseinandersetzen.

Blog

Nachdem voriges Jahr einige Aufgaben liegen geblieben sind, möchte ich diese nun 2019 erledigen. D.h. weniger Fotografie auf meiner Website, sondern wieder mehr Softwareentwicklung, IT und Technik. Die Fotografie wird auf meine Website https://norberteder.photography “verdrängt”. Der Umbau hat bereits begonnen.

Im Rückblick 2018 habe ich das Ende meines Projektes #fotomontag angekündigt – zumindest auf dieser Website. Es geht weiter, etwas verändert, aber doch. Ebenfalls auf https://norberteder.photography.

Lesen

Nachdem ich voriges Jahr relativ schnell meine ursprüngliches Ziel von 15 Büchern auf 50 angehoben habe, möchte ich dieses Jahr mit einem Ziel von 25 Büchern loslegen. Den Fortschritt könnt ihr auch dieses Jahr wieder auf https://goodreads.com verfolgen.

Zum Schluss möchte ich euch ein wunderbares Jahr 2019 wünschen. Viel Gesundheit, Glück, aber auch Erfolg.

Rückblick 2018

Rückblick 2018

Die Jahren fliegen dahin. Schon wieder ist eines rum. Wie jedes Jahr, möchte ich einen Blick zurück werfen und über die vergangenen 365 Tage nachdenken. Dabei möchte natürlich meine Ziele für 2018 nicht außer Acht lassen und in die Bewertung einfließen lassen.

Softwareentwicklung

Wie ich es mir vorgenommen habe, beschäftigte ich mich 2018 sehr viel mit .NET Core, Angular und dem Thema Internet of Things (IoT). Zusätzlich habe ich wieder über den Tellerrand geguckt und bei Golang reingeschnuppert. Gerade Golang entwickelt sich bei mir persönlich zu einer beliebten Programmiersprache.

Sehr viel Energie ging 2018 in das Thema Docker, Microservices und Orchestrierung.

Fotografie

Auch 2018 habe ich es geschafft, jeden Montag ein Foto für mein Projekt #fotomontag zu veröffentlichen. Nach 209 veröffentlichten Fotos in 4 Jahren, geht diese Ära allerdings zu Ende.

Zusätzlich hat sich gerade auf dem Gebiet der Fotografie sehr viel bei mir getan:

  • Zahlreiche wissenswerte Beiträge auf https://norberteder.photography, auch das Portfolio wurde überarbeitet und erweitert
  • Ich habe ja eine Liste meines Foto-Equipments auf meinem Blog. Dieser musste wieder adaptiert werden :)
  • Dieses Jahr habe ich es endlich geschafft und zahlreiche Portrait-/Model-Shootings gemacht. Dabei konnte ich richtig tolle Erfahrungen sammeln und mich weiterentwickeln. Vielen Dank an dieser Stelle an alle, mit denen ich zusammenwirken konnte.
  • Schlussendlich gab es eine Menge Fotoreisen: Piran/Portoroz, Dubrovnik, Kotor, Nürnberg, Ostsee, Dresden, Budapest und Prag.

Wie du siehst, hat sich also wirklich viel getan – mehr als ich mir erhofft bzw. geplant hatte.

Blog

Für das Blog hatte ich mir mehr vorgenommen. Zwar habe ich einige Artikel ausgemistet und aktualisiert, doch wollte ich wieder viel mehr über Softwareentwicklung bloggen. Durch die Arbeit einerseits und das doch aufwändige Hobby der Fotografie andererseits, blieb einfach zu wenig Zeit, die ich dann doch anderweitig nutzte.

Seit diesem Jahr steht die Kommentarfunktion nicht mehr zur Verfügung. Das ist nicht der DSGVO geschuldet, sondern vielmehr der Qualität. Feedback erhalte ich nun über andere Kanäle (E-Mail hauptsächlich) und das qualitativ hochwertiger, da der Aufwand für das Feedback einfach höher ist.

Ein herzliches Dankeschön an meine treuen Leser, die mir die Stange halten und auch immer wieder Feedback geben.

Bücher

Seit diesem Jahr verwalte ich meine Bücher über goodreads. Meinen Account hatte ich zwar schon lange, aber das Potential blieb mir lange Zeit verborgen. Nun, seit heuer nutze ich diese Plattform.

Für 2018 hatte ich mir vorgenommen, 15 Bücher zu lesen. Tatsächlich wurden es 50 (nicht ausschließlich Fach- bzw. Sachbücher).

Top 5 Beiträge

Fazit

Insgesamt hielt das Jahr 2018 zahlreiche Herausforderungen bereit. Das war nicht immer leicht, allerdings gab es wieder viel zu lernen – und das ist wichtig und gut.

Visual Studio 2017: Service Fabric Templates werden nicht angezeigt

Du hast das Azure Service Fabric SDK installiert, allerdings findest du im Visual Studio 2017 das Projekt-Template nicht und kannst somit kein neues Projekt anlegen? In diesem Fall sind eventuell die Service Fabric Tools des Azure Entwicklungsmoduls nicht installiert:

Service Fabric Tools für Visual Studio 2017 installieren
Service Fabric Tools für Visual Studio 2017 installieren

Es ist im Visual Studio Installer die Azure Entwicklung zu aktivieren, ebenso die Service Fabric-Tools.

Nach der Installation und des erneuten Startes von Visual Studio 2017 sind die Templates vorhanden.

Service Fabric Application Template | Visual Studio 2017
Service Fabric Application Template | Visual Studio 2017

Viel Spaß bei der Entwicklung.

Canary Deployment

In Blue Green Deployment habe ich einen Ansatz beschrieben, wie neue Releases in Produktivumgebungen vor der Aktivierung getestet werden können. Daraus lässt sich mit höherer Wahrscheinlichkeit auf die Funktionsfähigkeit eines Releases rückschließen. Allerdings wird nur getestet. Wie stabil und performant die Software läuft, kann nicht beurteilt werden. Eine Hilfe stellen Canary Deployments dar.

Canary Deployment (Kanarienvogel) hat den namentlichen Ursprung in den alten Kohleminen. Als Frühwarnsystem vor giftigen Gasen, haben die Minenarbeiter Kanarienvögel in Käfigen aufgestellt. Traten giftige Gase aus, sind die Kanarienvögel gestorben und die Arbeiter konnten sich noch schnell in Sicherheit bringen.

Wie funktioniert aber nun ein Canary Deployment?

Es gibt – wie auch beim Blue Green Deployment – zumindest zwei Produktivsysteme. Eines der beiden System (oder Teile davon) erhalten Updates. Nun kann der aktualisierte Part getestet werden (sowohl automatisiert, als auch manuell). Zudem wird ein zuvor definierter Teil des Traffics über das aktualisierte System geleitet.

Canary Deployment | Norbert Eder
Canary Deployment

Durch sukzessives Umleiten und Belasten des neuen Systems, werden aussagekräftige Hinweise über die Funktionsfähigkeit (auch unter Last) gegeben.

Ein Beispiel: Es wird festgelegt, dass nach der Aktualisierung, 2% des Traffics über das neue System geleitet werden. Treten keine Probleme auf, kann der Anteil erhöht werden. Treten Probleme auf, sind maximal 2% der Benutzer davon betroffen. Ein Rollback ist sofort möglich.

Mit diesem Aufbau steht also ein Frühwarnsystem zur Verfügung. Wir erhalten mehr Sicherheit und bei Problemen ist nur ein Bruchteil der Benutzer betroffen.

Einher geht allerdings auch ein infrastruktureller Aufwand und eine erhöhte Komplexität.

Blue Green Deployment

Viele Entwickler setzen mittlerweile auf die Unterstützung von automatisierten Tests und gewährleisten dadurch ein frühe Fehlererkennung, geringere Kosten bei der Behebung und schlussendlich eine hohe Qualität. Dennoch können Fehler nicht vollkommen ausgeschlossen werden.

Einer der Gründe hierfür ist, dass die Tests in der Regel nur in Testsystemen ausgeführt werden. Somit ist eine Aussage hinsichtlich der Funktionsweise im Produktivsystem nicht gegeben. Anwender überraschen uns Entwickler gerne mit unkonventionellen Eingaben oder einer eigenwilligen Bedienung der Software. Dies kann unter Umständen zu schiefen Datenständen führen. Was also in der Entwicklungs- bzw. Testumgebung funktioniert, muss dies noch lange nicht in der Produktivumgebung tun. Was kann man nun unternehmen, um eine bessere Aussage treffen zu können?

Eine Möglichkeit besteht im Blue Green Deployment. Dabei besteht das Produktivsystem zweimal. Einmal als blaue, einmal als grüne Linie. Aktiv ist immer nur eines der beiden Systeme. Das inaktive System kann für Tests herangezogen werden. Dabei können die Systeme auf unterschiedlicher (aber ähnlicher) Hardware oder VMs laufen.

Ein neues Release wird dabei immer am inaktiven System eingespielt und getestet. Sind alle Tests erfolgreich und stehen alle Funktionen zur Verfügung, wird das inaktive zum aktiven System und umgekehrt. In anderen Worten: War das blaue System aktiv und das grüne System inaktiv, dann erhielt das grüne System das Update und wurde nach erfolgreichen Tests aktiv. Nun ist das blaue System inaktiv und erhält das nächste kommende Update.

Dies bietet natürlich auch noch weitere Vorteile. So ist es sehr schnell möglich, wieder auf die alte Version zurückzugehen (Rollback). Zudem steht ein zweites System bei Ausfällen (Hardware etc.) zur Verfügung.

Die zusätzliche Sicherheit bringt jedoch einige Herausforderungen hinsichtlich Infrastruktur, Deploymentprozess, aber auch der Entwicklung (z.B. Umgang mit Schemaänderungen an der Datenbank) mit sich. Belohnt wird man durch eine höhere Ausfallssicherheit und einer möglichen (verbesserten) Aussage über die Funktionsfähigkeit eines neuen Releases im Produktivsystem.

Darauf aufbauend kann ein Canary Deployment eine noch bessere Aussagekraft im Produktiveinsatz geben.

Credit: Server-Icon von FontAwesome / CC Attribution 4.0 International, alle anderen Icons von Microsoft Powerpoint.

DELL XPS 13: Funktionstasten aktivieren

In der Standardeinstellung (für die meisten wohl ok, für Softwareentwickler richtig grausam), sind die Funktionstasten nur die zweite Belegung auf der Tastatur. In der primären Belegung werden die Multimedia-Tasten verwendet. Wer mit Funktionstasten arbeitet, kommt damit überhaupt nicht klar, vor allem, weil es auch einen Bruch in der bisherigen Bedienung darstellt.

Zum Glück kann dies im BIOS umgestellt werden. Nachfolgend siehst du die Standardeinstellung.

Dell XPS 13 Bios
Dell XPS 13 Bios

Wähle einfach Lock Mode Enable/Secondary im Abschnitt POST Behavior/Fn Lock Options und schon sind die Funktionstasten wieder ohne Fn zu verwenden.

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen