2014-04-05 20 views
12

Chcę wysłać żądanie HTTP POST z treścią zawierającą informacje, które składają się na prosty wpis na blogu, nic nadzwyczajnego.Jak pobierać wartości bryły z żądania HTTP POST w ASP.NET Web API ValueProvider?

Czytałem here że gdy chcesz powiązać typu złożonego (to jest typ, który nie string, int etc) w sieci Web API, dobrym rozwiązaniem jest utworzenie niestandardowego modelu spoiwa.

Mam niestandardowy segregator modelu (BlogPostModelBinder), który z kolei korzysta z niestandardowego dostawcy wartości (BlogPostValueProvider). Czego nie rozumiem, to w jaki sposób i gdzie mogę uzyskać dane z organu wniosku w BlogPostValueProvider?

Wewnątrz segregatora modelowego jest to, jak sądziłem, właściwy sposób na przykład pobrania tytułu.

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

natomiast BlogPostValueProvider wygląda następująco:

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. 
    } 
} 

To może być rozwiązywalne w łatwiejszy sposób, ale ponieważ jestem odkrywania Web API byłoby miło, aby zmusić go do pracy.

Mój problem polega po prostu na tym, że nie mogę znaleźć miejsca przechowywania treści żądania.

Dzięki za wskazówki!

+0

Jaki jest Twój typ zawartości żądania ... Jestem zakładając formurlencoded? ... czy mógłbyś podać więcej szczegółów, dlaczego potrzebujesz niestandardowego segregatora ... –

+0

Jeśli publikujesz json z BlogPostVM, potrzebujesz akcji, która akceptuje BlogPostVM, nie potrzebujesz niestandardowych segregatorów. –

+0

Myślę, że obaj jesteście poprawni. ContentType w żądaniu jest ustawione na json @KiranChalla. Posiadanie akcji z parametrem typu BlogPost może to zrobić. Nadal chciałbym wiedzieć, dlaczego nie mogę uzyskać dostępu do treści wniosku od dostawcy wartości. –

Odpowiedz

15

Oto blog post na ten temat od Rick Strahl. Jego wpis prawie odpowiada na twoje pytanie. Aby dostosować kod do swoich potrzeb, wykonaj następujące czynności.

W swoim konstruktorze dostawcy wartości przeczytaj treść żądania w ten sposób.

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

muszę zrobić to w ActionFilterAttribute do rejestrowania i roztwór znalazłem użyć ActionArguments w actionContext jak w

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) 
     };