it-swarm.com.de

Wie kann ich Body-Werte von einem HTTP abrufen? POST Anforderung in einem ASP.NET-Web-API-ValueProvider?

Ich möchte eine HTTP POST Anfrage mit dem Body senden, der Informationen enthält, aus denen ein einfacher Blogbeitrag besteht, nichts Besonderes.

Ich habe here so gelesen, dass, wenn Sie einen komplexen Typ (d. H. Einen Typ, der nicht string, int usw. ist) in der Web-API binden möchten, ein geeigneter Ansatz die Erstellung eines benutzerdefinierten Modellbinders ist.

Ich habe einen benutzerdefinierten Modellordner (BlogPostModelBinder), der wiederum einen benutzerdefinierten Wertanbieter (BlogPostValueProvider) verwendet. Was ich nicht verstehe ist, wie und wo kann ich die Daten aus dem Anforderungstext in BlogPostValueProvider abrufen?

In der Modellmappe ist dies meiner Meinung nach der richtige Weg, um beispielsweise den Titel abzurufen.

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
   ...
   var title= bindingContext.ValueProvider.GetValue("Title");
   ...
}

der BlogPostValueProvider sieht folgendermaßen aus:

 public class BlogPostValueProvider : IValueProvider
 {
    public BlogPostValueProvider(HttpActionContext actionContext)
    {
       // I can find request header information in the actionContext, but not the body.
    }

    public ValueProviderResult GetValue(string key)
    {
       // In some way return the value from the body with the given key.
    }
 }

Dies könnte auf eine einfachere Weise lösbar sein, aber da ich die Web-API erforsche, wäre es schön, wenn es funktioniert.

Mein Problem ist einfach, dass ich nicht finden kann, wo der Anforderungstext gespeichert ist.

Danke für jede Anleitung!

12
Jim Aho

Hier ist ein Blogbeitrag dazu von Rick Strahl. Sein Beitrag beantwortet fast deine Frage. Um seinen Code an Ihre Bedürfnisse anzupassen, würden Sie Folgendes tun.

Lesen Sie im Konstruktor Ihres Wertanbieters den Anforderungshauptteil wie folgt.

Task<string> content = actionContext.Request.Content.ReadAsStringAsync();
string body = content.Result;
19
Alex

Ich musste dies in einem ActionFilterAttribute zur Protokollierung durchführen, und die Lösung, die ich fand, bestand darin, die ActionArguments im actionContext wie in zu verwenden

public class ExternalApiTraceAttribute : ActionFilterAttribute
{


    public override void OnActionExecuting(HttpActionContext actionContext)
    {
       ...

        var externalApiAudit = new ExternalApiAudit()
        {

            Method = actionContext.Request.Method.ToString(),
            RequestPath = actionContext.Request.RequestUri.AbsolutePath,
            IpAddresss = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request.UserHostAddress,
            DateOccurred = DateTime.UtcNow,
            Arguments = Serialize(actionContext.ActionArguments)
        };
0
ColinM