首先感谢你抽出时间阅读这篇文章。
我一直在构建我的第一个asp.net 4.5 MVC4 Web Api,但是在controll POST方法中收到的值总是为NULL。
为了测试POST api方法我尝试过Fiddler和Google Chrome Simple REST Clinet,但结果总是一样。
这是我的代码:
控制器(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);
}
}
模型类
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方法终端中收到的值始终为NULL。
以下是我使用Fiddler进行POST的命令:
方式: POST
地址:
http://localhost:52036/api/terminal
标题
Content-Type: application/json
Host: localhost:52036
Content-Length: 60
体:
{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12}
-----------编辑 - 13-04-2014 14:56 -------------
我已按照以下详细信息修改了我对这个问题的一些回复中建议的Fiddler http post请求。但是,在VS2013调试模式下进行测试时,我一直收到500 HTTP错误,我的API代码甚至无法访问控制器。
地址
POST
http://localhost:52036/api/terminal/
标题
Content-Type: application/json; charset=utf-8
Host: localhost:52036
Content-Length: 62
车身
{"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"}
--------------编辑13/04/2014 20:38 -----------------
好的,使用Google的Chrome REST客户端,我注意到以下返回错误消息:
{“消息”:“发生了错误。”,“ExceptionMessage”:“属性 'ClockingDemo.Models.Terminal'类型的'TerminalId'无效。 标记为[必需]的值类型属性也必须标记为 [DataMember(IsRequired = true)]被识别为必需。考虑 使用[DataContract]和属性归因声明类型 同 [数据成员(IsRequired =真)] “” ExceptionType。 “:” System.InvalidOperationException “ ”堆栈跟踪“:” 在 System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata 元数据,对象容器)\ r \ n at System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n
在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n
在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata 元数据,ValidationContext validationContext)\ r \ n at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n
在 System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象 model,Type type,ModelMetadataProvider metadataProvider, HttpActionContext actionContext,String keyPrefix)\ r \ n at 。System.Web.Http.ModelBinding.FormatterParameterBinding&LT;&GT; c__DisplayClass1.b__0(对象 模特)\ r \ n at System.Threading.Tasks.TaskHelpersExtensions&LT;&GT; c__DisplayClass361.<>c__DisplayClass38.<Then>b__35()\r\n at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass49.<ToAsyncVoidTask>b__48()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func
1 func,CancellationToken cancellationToken)“}
我认为问题来自于我的 INTEGER 属性 TerminalId 被定义为 [必需] 。我觉得设置非NULLABLE属性和 [必需] 可能存在问题。
非常乐于接受建议。
----------------- ANSWER ---------------
我终于偶然发现了这个为我解决问题的线程。 DataAnnotation for Required property
只需将其粘贴到Global.asax文件中:
GlobalConfiguration.Configuration.Services.RemoveAll(
typeof(System.Web.Http.Validation.ModelValidatorProvider),
v => v is InvalidModelValidatorProvider);
如果您认为有更好的方法,我仍然愿意接受其他解决方案。
答案 0 :(得分:0)
在Fiddler你必须使用如下
您的请求机构应该喜欢 {“TerminalId”:123,“Tag”:“222”,“TagDate”:“2014-04-13 04:22:12”} 在您的请求标头中,您需要传递内容类型,如 Content-Type:application / json;字符集= UTF-8 强>
答案 1 :(得分:0)
就我而言,我有一个带有MVC和Web API的混合ASP.NET Web窗体。
就这样解决了:
public HttpResponseMessage PostTerminal(JObject jsonMessage)
{
var terminal = jsonMessage.ToObject<Terminal>();
if (terminal == null)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, terminal);
}
...
}