ASP.NET WEB API is not bound to a dynamic object on POST

If you have the following Api Controller ... using StrutureMap for DI ...

using System; using System.Dynamic; using System.Net; using System.Net.Http; using System.Web.Http; using IdentityService.Domain; using IdentityService.Domain.Contracts; using IdentityService.Domain.Models; namespace IdentityService.Controllers { public class AccountController : ApiController { private readonly IRepository<Client> _clientRepository; private readonly IRepository<RelyingParty> _relyingPartyRepository; private readonly IRepository<Token> _tokenRepository; public AccountController( IRepository<Client> clientRepository, IRepository<RelyingParty> relyingPartyRepository, IRepository<Token> tokenRepository) { _clientRepository = clientRepository; _relyingPartyRepository = relyingPartyRepository; _tokenRepository = tokenRepository; } public HttpResponseMessage Post( [FromBody] dynamic data) { dynamic result = new ExpandoObject(); try { var clientAuthenticator = new ClientAuthenticator( _clientRepository, _relyingPartyRepository, _tokenRepository); Token token; clientAuthenticator.Authenticate( data.Key, data.ChecksumValue, data.Checksum, data.Name, data.Password, out token); result.Token = token; } catch (Exception ex) { result.ErrorCode = ex.GetType().ToString(); result.ErrorMessage = ex.GetBaseException().Message; } return this.Request.CreateResponse(HttpStatusCode.OK, (ExpandoObject)result); } } } 

Using Fiddler, I make the following message:

 POST http://localhost:54029/api/account HTTP/1.1 User-Agent: Fiddler Host: localhost:54029 Content-Type: "application/json" Content-Length: 218 { "Key": "7d42276d3c3954716c672543385b575836472f5d543d7776205627413a", "ChecksumValue": "127.0.0.1", "Checksum": "ao4Ei77BaX1/iMZMTAJxWzt4fxc=", "Name": "jeanlucpicard", "Password": "master" } 

Any idea why my data will be blank? I tried switching to JObject , without success. All the examples I found make me think this should work.

Here is the complete answer:

 HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Type: application/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcY29kZS1tYXR0cnVtYVx0YWxrLWF1dGhlbnRpY2F0aW9uLXNlcnZlclxJZGVudGl0eVNlcnZpY2VcYXBpXGFjY291bnQ=?= X-Powered-By: ASP.NET Date: Mon, 27 May 2013 13:59:45 GMT Content-Length: 137 {"ErrorCode":"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException","ErrorMessage":"Cannot perform runtime binding on a null reference"} 

Any help would be greatly appreciated!

Update

I tried just a simple example, for example:

 public async Task<dynamic> Post(dynamic data) { var body = await Request.Content.ReadAsStringAsync(); return data; } 

The data parameter is still null , but I see the values ​​in body .

+3
source share
3 answers

Remove the quotation marks from "application / json".

 Content-Type: application/json 
+6
source

In MVC 6 controller (which continues from Controller , not ApiController ) the following works (with report is JSON):

  [HttpPost("[action]")] public void RunReport([FromBody]dynamic report) { .... } 

Updated: for MVC 5 this is what I use

  [HttpPost] public async Task<HttpResponseMessage> FBLogin(Newtonsoft.Json.Linq.JObject jObject) { dynamic data = (dynamic)jObject; string accessToken = data.accessToken; ... } 

Where is the JSON payload:

  '{accessToken: "EAAJF9eVIKOsBABdKVNOLJyfyCnnkrl8mlW2crgZC1NYsDqgq9ZBIZC......" }' 
+2
source

remove the [FromBody] attribute and it should work

0
source

Source: https://habr.com/ru/post/945959/


All Articles