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]
属性,它应该工作