Wie kann ich den Inhalt der PUT-Anforderung in der MVC webApi-Controller-Aktion lesen?
[HttpPut]
public HttpResponseMessage Put(int accountId, Contact contact)
{
var httpContent = Request.Content;
var asyncContent = httpContent.ReadAsStringAsync().Result;
...
Ich bekomme hier eine leere Zeichenfolge :(
Was ich tun muss, ist: herauszufinden, "welche Eigenschaften" in der ersten Anforderung geändert / gesendet wurden (dh wenn das Contact
Objekt 10 Eigenschaften hat und ich nur 2 davon aktualisieren möchte, sende ich und Objekte mit nur zwei Eigenschaften, etwas wie das:
{
"FirstName": null,
"LastName": null,
"id": 21
}
Das erwartete Endergebnis ist
List<string> modified_properties = {"FirstName", "LastName"}
Sie können Ihren CONTACT-Parameter folgendermaßen beibehalten:
using (var stream = new MemoryStream()) { var context = (HttpContextBase)Request.Properties["MS_HttpContext"]; context.Request.InputStream.Seek(0, SeekOrigin.Begin); context.Request.InputStream.CopyTo(stream); string requestBody = Encoding.UTF8.GetString(stream.ToArray()); }
Hat mir die JSON-Darstellung meines Parameterobjekts zurückgegeben, damit ich sie für die Ausnahmebehandlung und Protokollierung verwenden kann.
Hier als akzeptierte Antwort gefunden
quelle
Auch wenn diese Lösung offensichtlich erscheint, wollte ich sie nur hier posten, damit der nächste sie schneller googelt.
Wenn Sie das Modell weiterhin als Parameter in der Methode haben möchten, können Sie ein erstellen,
DelegatingHandler
um den Inhalt zu puffern.internal sealed class BufferizingHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { await request.Content.LoadIntoBufferAsync(); var result = await base.SendAsync(request, cancellationToken); return result; } }
Und fügen Sie es den globalen Nachrichtenhandlern hinzu:
configuration.MessageHandlers.Add(new BufferizingHandler());
Diese Lösung basiert auf der Antwort von Darrel Miller .
Auf diese Weise werden alle Anforderungen gepuffert.
quelle