title: Reading dynamic object FromBody in WebAPI just doesn't work
body: <p>I found a lot of info about this topic, but none of those sites and articles could solve my problem. I'm having a pretty simple method:</p>
  
  <pre><code>[HttpPost, Route("Diagnosis/{lkNo}/Tree/{nodeID:int}/Answer")]
  public List&lt;TreeNode&gt; AnswerTreeNode(string lkNo, int nodeID, 
  [FromBody] dynamic data) {
      // So some stuff
  }
  </code></pre>
  
  <p>When I call that method, it fills the first two parameters, but data is always null. Here's my test request as received by the server:</p>
  
  <pre><code>POST /Diagnosis/LK-28084453/Tree/0/Answer HTTP/1.1
  Cache-Control: no-cache
  Connection: keep-alive
  Accept: */*
  Accept-Encoding: gzip, deflate
  Cookie: ASP.NET_SessionId=*****; __RequestVerificationToken=*****
  Host: localhost:51124
  User-Agent: PostmanRuntime/7.6.0
  Postman-Token: *****
  Content-Length: 5
  Content-Type: application/x-www-form-urlencoded
  
  =Test
  </code></pre>
  
  <p>Sending the parameter as json leads to the same result:</p>
  
  <pre><code>...
  Content-Length: 25
  Content-Type: application/json
  
  { "value": "some value" }
  </code></pre>
  
  <p>Whatever I try, data is always null. Here's my route config:</p>
  
  <pre><code>// WebAPI
  GlobalConfiguration.Configure(config =&gt; {
      config.MapHttpAttributeRoutes();
  
      config.Routes.MapHttpRoute(
          name: "DiagnosisApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );
  
      // Default return JSON
      config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
      config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
          new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
  
      config.MessageHandlers.Add(new MyHandler());
  });
  
  public class MyHandler : System.Net.Http.DelegatingHandler {
      protected override async System.Threading.Tasks.Task&lt;System.Net.Http.HttpResponseMessage&gt; SendAsync(
                                               System.Net.Http.HttpRequestMessage request,
                                                  System.Threading.CancellationToken token) {
          System.Net.Http.HttpMessageContent requestContent = new System.Net.Http.HttpMessageContent(request);
          string requestMessage = requestContent.ReadAsStringAsync().Result; // This one contains the raw requests as posted abve
  
          return await base.SendAsync(request, token);
      }
  }
  </code></pre>
  
  <p>Do you have an idea, what's wrong here?</p>