Ergebnisse:
%Vor% JsonPropertyAttribute wird eindeutig unterstützt, da ich den PropertyName festlegen und wirksam werden lassen kann. Allerdings würde ich erwarten, dass ModelState.IsValid
für die ersten beiden Beispieleingaben falsch ist, weil der Parameter Required
JsonProperty auf Always gesetzt wurde.
Wenn ich es einfach durch JsonConvert laufen lasse:
%Vor%Während der Deserialisierung wird wie erwartet eine Ausnahme ausgelöst:
%Vor%Um das zu lösen, habe ich meinen eigenen JSON.NET MediaTypeFormatter erstellt. Mein Formatierer lässt zu, dass die JSON.NET-Deserialisierungs-Ausnahmen ausgeblendet werden, was dazu führt, dass die Ausnahmebedingungsinformationen an den Aufrufer zurückgegeben werden.
Hier ist der MediaTypeFormatter, den ich gebaut habe:
%Vor%Um diesen Formatierer über den eingebauten zu verwenden, habe ich diese Zeile meiner WebApiConfig hinzugefügt:
%Vor%Wenn Sie es an Index 0 einfügen, hat es Vorrang vor dem integrierten Formatierer. Wenn Sie möchten, können Sie den integrierten JSON-Formatierer entfernen.
In diesem Szenario ist ModelState
immer gültig in der Aktion, weil eine Ausnahme an den Benutzer zurückgeworfen wird, bevor die Aktion jemals ausgelöst wird, wenn die Deserialisierung fehlschlägt. Es müsste noch mehr Arbeit geleistet werden, um die Aktion mit einem Null-Parameter FromBody
auszuführen.
Der Standardwert JsonMediaTypeFormatter
macht nicht abhängig von der JsonProperty
, um zu entscheiden, ob Modellfelder erforderlich sind oder nicht. Es beruht jedoch auf dem RequiredAttribute
Wenn Sie dies tun möchten, dann implementieren Sie eine neue IRequiredMemberSelector
und setzen Sie es auf MediaTypeFormatter.RequiredMemberSelector
.
In Ihrer Implementierung von IRequiredMemberSelector
wird Ihnen ein MemberInfo
übergeben. Sie können das verwenden, um zu bewerten, ob Modellmitglieder das Attribut JsonProperty
haben und ob das erforderliche Flag gesetzt ist und schließlich true oder false zurückgibt. Diese wird in die Eigenschaft ModelState.IsValid
propagiert (es wird jedoch nicht die JSON.NET-Fehlermeldung, sondern die DataAnnotations / WebApi-Fehlermeldung verwendet.
Wenn Sie dies tun, schlage ich vor, dass Sie auch das Standardverhalten beibehalten.
Wenn Sie nur JSON unterstützen möchten, können Sie dies tun:
%Vor%Man könnte denken, dass die Web-API 400 BAD REQUEST (mit zusätzlichen Fehlerinformationen in JSON) automatisch zurückgibt, wenn Serialisierung / Validierung fehlschlägt, aber meh ... Es ist nicht so fortgeschritten, wie es aussieht.
Tags und Links asp.net-web-api c# asp.net asp.net-web-api2 json.net