首先感谢您抽出时间阅读这篇文章 .
我一直在构建我的第一个asp.net 4.5 MVC4 Web Api,但是在controll POST方法中收到的值总是为NULL .
为了测试POST api方法,我尝试了Fiddler和Google Chrome Simple REST Clinet,但结果总是一样的 .
这是我的代码:
Controller (POST)
// POST api/Terminal
public HttpResponseMessage PostTerminal(Terminal terminal)
{
if (terminal == null)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, terminal);
}
if (ModelState.IsValid)
{
db.Terminals.Add(terminal);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, terminal);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = terminal.Id }));
return response;
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
Model Class
public class Terminal
{
public int Id { get; set; }
[Required]
public int TerminalId { get; set; }
[Required]
public string Tag { get; set; }
[Required]
public DateTime TagDate { get; set; }
}
在上面的代码中,POST方法 terminal 中收到的值始终为NULL .
这是我使用Fiddler进行POST的命令:
Method: POST
Address:
http://localhost:52036/api/terminal
Header:
Content-Type: application/json
Host: localhost:52036
Content-Length: 60
Body:
{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12}
----------- EDIT - 13-04-2014 14:56 -------------
我已按照以下详细信息修改了我对此问题的一些回复中建议的Fiddler http post请求 . 但是,当我在VS2013调试模式下进行测试时,我一直收到500 HTTP错误,我的API代码甚至没有到达Controller .
Address
POST
http://localhost:52036/api/terminal/
Header
Content-Type: application/json; charset=utf-8
Host: localhost:52036
Content-Length: 62
Body
{"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"}
-------------- Edit 13/04/2014 20:38 -----------------
好的,使用Google的Chrome REST客户端,我注意到以下返回错误消息:
{“消息”:“发生错误 . ”,“ExceptionMessage”:“类型'ClockingDemo.Models.Terminal'上的属性'TerminalId'无效 . 标记为[必需]的值类型属性也必须标记为[ DataMember(IsRequired = true)]被认为是必需的 . 考虑使用[DataContract]归属声明类型和[DataMember(IsRequired = true)]的属性 . “,”ExceptionType“:”System.InvalidOperationException“,”StackTrace“ :“System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata metadata,Object container)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata metadata,ValidationContext validationContext,Object container) r \ n at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata,ValidationContext validatio) nContext)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象模型,类型类型) ,System.Threading.Tasks.TaskHelpersExtensions中的System.Web.Http.ModelBinding.FormatterParameterBinding . <> c__DisplayClass1.b__0(对象模型)\ r \ n中的ModelMetadataProvider metadataProvider,HttpActionContext actionContext,String keyPrefix)\ r \ n . <> c__DisplayClass361 . <> c__DisplayClass38 . <Then> b__35()\ r \ n在System.Threading.Tasks.TaskHelpersExtensions . <> c__DisplayClass49 . <ToAsyncVoidTask> b__48()\ r \ n在System.Threading.Tasks.TaskHelpers.RunSynchronously [TResult] ](Func1 func,CancellationToken cancellationToken)“}
我认为问题来自于我的 INTEGER 属性 TerminalId 被定义为 [Required] . 我觉得设置非NULLABLE属性和 [Required] 可能存在问题 .
非常乐于接受建议 .
----------------- ANSWER ---------------
我终于偶然发现了这个为我解决问题的线程 . DataAnnotation for Required property
只需将其粘贴到Global.asax文件中:
GlobalConfiguration.Configuration.Services.RemoveAll(
typeof(System.Web.Http.Validation.ModelValidatorProvider),
v => v is InvalidModelValidatorProvider);
如果您认为有更好的方法,我仍然愿意接受其他解决方案 .
2 回答
在Fiddler你必须使用如下
您的请求正文应该喜欢这个 {"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"} ,并且在您的请求 Headers 中,您需要传递类似这样的内容类型 Content-Type: application/json; charset=utf-8
在我的例子中,我有一个带有MVC和Web API的混合ASP.NET Web窗体 .
就这样解决了:
参考文献:http://weblog.west-wind.com/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API-Controller-Methods