Ich bin in einer Situation, in der ich eine eingehende HTTP-POST-Anfrage mit Daten im Hauptteil an einen konkreten Typ abhängig von einem ProductType
Nenner in den Daten binden muss. Hier ist meine Web API 2 Aktionsmethode:
Ich dachte zuerst daran, einen benutzerdefinierten Modellordner zu verwenden, aber scheint wie es ist nicht möglich, zu diesem Zeitpunkt auf den Anfragetext zuzugreifen:
Bei komplexen Typen versucht die Web-API den Wert aus der Nachricht zu lesen Körper, mit einem Medien-Formatierer.
Ich kann nicht wirklich sehen, wie media-type Formatierer dieses Problem lösen, aber ich vermisse wahrscheinlich etwas. Wie würden Sie dieses Problem lösen?
Je nach dem Inhaltstyp der Anfrage müssen Sie entscheiden, welche konkrete Klasse instanziiert werden soll. Nehmen wir ein Beispiel mit application/json
. Für diesen Inhaltstyp verwendet die Web-API standardmäßig das JSON.NET-Framework, um die Nutzdaten des Anfragetexts in ein konkretes Objekt zu deserialisieren.
Sie müssen sich also in dieses Framework einklinken, um die gewünschte Funktionalität zu erreichen. Ein guter Erweiterungspunkt in diesem Framework ist das Schreiben einer benutzerdefinierten JsonConverter
. Angenommen, Sie haben folgende Klassen:
und die folgende Aktion:
%Vor%Lassen Sie uns einen benutzerdefinierten Konverter schreiben, der diesen Typ behandelt:
%Vor% und der letzte Schritt besteht darin, diesen benutzerdefinierten Konverter in WebApiConfig
:
Und das ist es ziemlich. Jetzt können Sie folgende Anfrage senden:
%Vor%und der Server wird diese Nachricht richtig deserialisieren und antworten mit:
%Vor% Wenn Sie andere Formate wie application/xml
verarbeiten müssen, können Sie das gleiche tun und den entsprechenden Serializer anschließen.
Tags und Links asp.net-web-api c# model-binding