myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » (CRUD / .NET Core) HttpContext.Response - ErrorMessage
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

(CRUD / .NET Core) HttpContext.Response - ErrorMessage

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Froschkoenig84
myCSharp.de-Mitglied

Dabei seit: 11.06.2015
Beiträge: 58
Entwicklungsumgebung: C#.NET, VUE.JS, PHP, SQL/Mongo
Herkunft: Scheibenwelt


Froschkoenig84 ist offline

(CRUD / .NET Core) HttpContext.Response - ErrorMessage

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Infos:
#########################
# - .NET Core
# - CRUD (WebAPI)
# - Dapper
# - Swagger
#########################



Hallo,

ich habe heute meine aller erste CRUD-API unter .NET Core gebaut und möchte gerne einen Fehler zurückgeben...

C#-Code:
// PUT api/users/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] Dictionary<string,object> modFields)
{
    var userProbs = typeof(User).GetProperties().Select(p => p.Name);
    var unknownFields = modFields.Keys.Where(k => !userProbs.Contains(k, StringComparer.OrdinalIgnoreCase));
    if (unknownFields.Count() == 0)
    {
        // _repo.ModUser(id, modUser);
    }
    else
    {
        HttpContext.Response.StatusCode = 502;
    }
}

Okay, so kann ich also einen StatusCode zurückgeben, aber gibt es hierzu auch einen Status oder eine ErrorMessage? - Will dem Client sagen, dass sein Put-Data nicht unterstützte Felder besitzt und daher nicht verarbeitet wird.

Das muss ja möglich sein, hier auch einen Fehler-Text ausgeben zu können oder?


EDIT: Swagger-PUT-Screenshot:
 

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Froschkoenig84 am 29.08.2019 17:55.

Neuer Beitrag 29.08.2019 17:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Papst Papst ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.09.2014
Beiträge: 268
Entwicklungsumgebung: VS2017
Herkunft: Kassel


Papst ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vom Prinzip solltest du eine echte Klasse erstellen und diese aus dem Body lesen lassen.
Ist das Model dann nicht valide wird die MVC Middleware von sich aus 404 (vermute ich) senden, weil keine passende Route gefunden wurde.

Reflection würde ich niemals (manuell) da verwenden, wo es sich vermeiden lässt.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Papst am 29.08.2019 17:40.

Neuer Beitrag 29.08.2019 17:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Froschkoenig84
myCSharp.de-Mitglied

Dabei seit: 11.06.2015
Beiträge: 58
Entwicklungsumgebung: C#.NET, VUE.JS, PHP, SQL/Mongo
Herkunft: Scheibenwelt

Themenstarter Thema begonnen von Froschkoenig84

Froschkoenig84 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Na ja, die Reflection sei mal dahingestellt, aber gibt es in .NET Core keine individuelle ErrorMessages mehr?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Froschkoenig84 am 29.08.2019 17:55.

Neuer Beitrag 29.08.2019 17:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.518
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist online Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Froschkoenig84
Was meinst du den mit individueller ErrorMessage?
Da deine Put Methode keinen Response liefert, kann der Client außer dem HTTP Status Code ja keine Meldung erhalten?

Oder beziehst du dich auf das Verhalten der WebAPI?
Was sollte die Web API dann liefern, wenn diese kein gültiges Model auf die Url Mappen kann?
Da auch das Response Format von dir vorgeben werden kann, müsste für eine generierte ErrorMessages auch bekannt sein welches Antworten Format geliefert werden müsste.
Das gehört aber nicht zu den Aufgaben der WebAPI oder .NET Core an dieser Stelle.

Ein Status Code 404 ist hier an sich schon die sinnvollste Lösung um einen Fehler zu vermitteln.
Du kannst diesen Fall aber durch sauberes Fehlerhandling in deiner API abdecken und dann eine Meldung liefern.

Wir setzten bei uns auch eine WebAPI in einem Projekt als neue API ein.
Dort arbeite ich dann mit einer eigenen Implementierung der Controller/Action Selector um diesen Fall abzufangen und eine eigene Json Fehlermeldung nach unserem Format zu liefern.

T-Virus
Neuer Beitrag 29.08.2019 18:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.835
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die WebAPI ist ein eigenständiges Microsoft Produkt und nennt sich ASP.NET WebAPI und gibt's in der Version 2.2. Dies ging in die ASP.NET MVC Produkte über.
Du verwendest offenbar einfach nur ASP.NET Core und die MVC Middleware.

Du hast in Deiner Action void als Rückgabe - also keine Rückgabe - definiert.
Dann kannst auch nichts ordentlich zurück geben.

Du solltest IActionResult zurück geben, sodass Du a) ordentlich Werte zurückgeben kannst und b) die Middleware weiß, dass überhaupt eine Rückgabe existiert.
Put sollte ohnehin immer eine idempotente Rückgabe haben - und das geht nicht mit void.

Bitte mach einfach Mal die ersten 10 Minuten das ASP.NET Core Tutorial durch - da ist das alles erklärt.
Zudem bitte, wenn Du schon so künstlerisch die Technologien angibst: Gib doch die richtigen Namen an :-)

PS: 404 sagt nur aus, dass etwas nicht gefunden wurde.
Alle logischen Fehler sind später 500.xx Fehler.
Neuer Beitrag 30.08.2019 08:02 Beiträge des Benutzers | zu Buddylist hinzufügen
Froschkoenig84
myCSharp.de-Mitglied

Dabei seit: 11.06.2015
Beiträge: 58
Entwicklungsumgebung: C#.NET, VUE.JS, PHP, SQL/Mongo
Herkunft: Scheibenwelt

Themenstarter Thema begonnen von Froschkoenig84

Froschkoenig84 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie ihr seht, hatte ich ja die Rückgabe nur testweise auf VOID zrückgesetzt. Daher ist die reguläre/erfolgreiche Rückgabe ja auch auskommentiert. Wobei ich gerade sehe, das sich - wieso auch immer das return weggenommen hab. - Aber egal...

Ich suche nur nach einer Möglichkeit, neben dem StatusCode noch eine zusätzliche ErrorMessage zurückzugeben. Aber ich denke, verstanden zu haben, dass ich die Fehler quasi als klassische Rückgabe definieren müsste, ...

...bei einem invaliden POST wurde diese Ausgabe automatisch generiert, auch wenn mir die Trace-ID noch nicht ganz klar ist. Dachte eben, da gäbe es eine Basisklasse für die Ausgabe von Fehler-Meldungen.

 

Notfalls baue ich die Ausgabe händisch nach.
Ich vermute mal
[400 Bad Request] und als ErrorMessage eben die obige Ausgabe mit den aufgelisteten unbekannten Feldern. Ggf. würde sicherlich auch ein 5XX gehen, aber ich finde keinen passenden.
Daher den 400er oder doch den 404er. Wobei die angefragte Ressource ja gefunden wurde, nur dass die übermittelten Felder nicht existieren.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Froschkoenig84 am 30.08.2019 10:29.

Neuer Beitrag 30.08.2019 10:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Froschkoenig84
myCSharp.de-Mitglied

Dabei seit: 11.06.2015
Beiträge: 58
Entwicklungsumgebung: C#.NET, VUE.JS, PHP, SQL/Mongo
Herkunft: Scheibenwelt

Themenstarter Thema begonnen von Froschkoenig84

Froschkoenig84 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sicherlich wäre es nützlich später noch eine Validierungsklasse zu erzeugen. Wie gesagt, ich probiere noch aus. Aber händisch erzeugt wäre es dieser Code... (Sorry wegen des Quick'n'Dirty-JSON-Objekts)

C#-Code:
// PUT api/users/5
[HttpPut("{id}")]
public object Put(int id, [FromBody] Dictionary<string,object> modFields)
{
    var userProbs = typeof(User).GetProperties().Select(p => p.Name);
    var unknownFields = modFields.Keys.Where(k => !userProbs.Contains(k, StringComparer.OrdinalIgnoreCase));
    if (unknownFields.Count() == 0)
    {
        //return _repo.ModUser(id, modUser);
        return 1; //just a test-obj
    }
    else
    {
        var httpStatusCode = 400;
        var fieldsErrJson = unknownFields.Select(f => "\"" + f + "\": [\"[User." + f + "] field is unknown.\"]").ToList();
        var statusJson = "{ \"errors\": { "+String.Join(", ",fieldsErrJson)+" }, \"title\": \"One or more validation errors occurred.\", \"status\": "+httpStatusCode+", \"traceId\": \"0:00000000\" }";

        HttpContext.Response.StatusCode = httpStatusCode;
        return JsonConvert.DeserializeObject<object>(statusJson);
    }
}

Und erzeugt...
 

Falls das irgendwie einfacher geht, immer her damit. :)

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Froschkoenig84 am 30.08.2019 10:31.

Neuer Beitrag 30.08.2019 10:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.835
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Warum object? Wieso untypisiert?
Wieso nicht wie beschrieben und in der Doku nachzulesen IActionResult bzw Task<IActionResult>?
Das hat schon alles so seinen Grund....

Für die Swagger Generierung (normalerweise würde man das Swagger vorher erzeugen, nicht in der Runtime: contract based development) verwendet man Attribute.
Siehe auch ein kurzer 2 Min Blick in die Doku.

Die Doku zeigt übrigens auch ein sauberes exception handling durch entsprechende Pipeline Registrierungen.
Muss man alles nicht selbst erfinden.
Neuer Beitrag 30.08.2019 12:41 Beiträge des Benutzers | zu Buddylist hinzufügen
Froschkoenig84
myCSharp.de-Mitglied

Dabei seit: 11.06.2015
Beiträge: 58
Entwicklungsumgebung: C#.NET, VUE.JS, PHP, SQL/Mongo
Herkunft: Scheibenwelt

Themenstarter Thema begonnen von Froschkoenig84

Froschkoenig84 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Na ja, Swagger mach ich ja nur, ums zu Testen. Postman wird aus irgendeinem Grund geblockt, da ich das SSL-Zertifikat vom IIS-Express nutze. - Mal sehen, wie das am Ende laufen wird.

Aber Danke für den Hinweis, werde ich am Wochenende mal reinschauen. - Wie gesagt, das ist nur ein Dumm, damit ich weiß, wie ich das zukünftig machen müsste. Feinschliff erfolgt später, ich kann eben nicht gleich perfekt anfangen, außerdem lerne ich mit der Erfahrung.

Am Wochenende muss ich mir mal die ASP.NET Core Identity Auth(s) anschauen. Da ich Dapper nutze, ließ sich das Identity Framework (EF) nicht nutzen. - Es gibt zwar ein paar Git-Projekte, die es mit Dapper realisieren, aber unabhängig davon benötige ich eine einfache Lösung für JWT-Tokens, die ich später mit OAuth-2 (sobald der Kunde etwas mehr Budget freigibt) verknüpfen kann. Ist nur ein internes Dashboard (quasi eine Verwaltungsplattform), daher nicht so kritisch, aber man möchte ja auch für spätere Projekte dazulernen. Wer weiß, vielleicht wird das Ding irgendwann mal riesig und sobald Rechnungen über die Plattform generiert werden, muss es auch wirklich ernsthaft sicher sein.

Aber dennoch vielen Dank für eure Unterstützung, ich nehme das wirklich alles sehr ernst.
Neuer Beitrag 30.08.2019 14:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.835
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In den Postman Settings kann man SSL verification deaktivieren.
Postman fragt dies auch in einem Pop-up beim ersten Mal ab.
Neuer Beitrag 30.08.2019 18:11 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 9 Monate.
Der letzte Beitrag ist älter als 9 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 06.06.2020 12:51