ASP.NET WEB API没有绑定到POST上的动态对象

如果有以下Api控制器…使用StrutureMap进行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 _clientRepository; private readonly IRepository _relyingPartyRepository; private readonly IRepository _tokenRepository; public AccountController( IRepository clientRepository, IRepository relyingPartyRepository, IRepository 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); } } } 

使用Fiddler,我发表以下post:

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

知道为什么我的数据会为空吗? 我试过切换到JObject ,没有成功。 我发现的所有例子都让我认为这应该有效。

这是完整的回复:

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

任何帮助将非常感激!

更新

我只尝试了一个简单的例子,例如:

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

参数data仍然为null ,但我可以看到body的值。

从“application / json”中删除引号。

 Content-Type: application/json 

在MVC 6控制器(从Controller而不是ApiController )中,以下工作( report为JSON):

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

更新:对于MVC 5,这是我使用的

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

JSON有效负载的位置是:

  '{accessToken: "EAAJF9eVIKOsBABdKVNOLJyfyCnnkrl8mlW2crgZC1NYsDqgq9ZBIZC......" }' 

删除[FromBody]属性,它应该工作