![](/img/trans.png)
[英]How do I retrieve body values from an HTTP POST request in an ASP.NET Web API ValueProvider?
[英]Entity Framework ASP.NET; HTTP POST: required values exist in JSON request body DbEntityValidationException
我正在尝试通过我的ASP.NET Web服务API发布一些数据,但是当我尝试发布JSON字符串时它会抛出一个DbEntityValidationException。 我试图发布我的JSON字符串在哪里出错了?
我使用这个代码块来帮助我调试我的问题,但是它告诉我当JSON字符串中存在我的字段时需要它,几乎将字符串视为从未存在过。 它让我知道请求体是否为空,但无论名称值对如何,它仍然告诉我这些字段是必需的。
我试图发布的JSON字符串几乎是从帮助页面中删除的
{
"CUSTOMER_ID": 7.0,
"CUSTOMER_USERNAME": "sample string 2",
"CUSTOMER_PASSWORD": "sample string 3",
"CUSTOMER_NAME": "sample string 4",
"CUSTOMER_EMAIL": "sample string 5"
}
我得到的回应是
Response: 500
"Message": "An error has occurred.",
"ExceptionMessage": "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. The validation errors are: CUSTOMER.CUSTOMER_USERNAME: The CUSTOMER_USERNAME field is required.; CUSTOMER.CUSTOMER_PASSWORD: The CUSTOMER_PASSWORD field is required.; CUSTOMER.CUSTOMER_NAME: The CUSTOMER_NAME field is required.; CUSTOMER.CUSTOMER_EMAIL: The CUSTOMER_EMAIL field is required.",
"ExceptionType": "System.Data.Entity.Validation.DbEntityValidationException"
"StackTrace": " at WebAPI.Models.Entities3.SaveChangesAsync() in C:\\Users\\[username]\\Desktop\\[folder]\\WebAPI\\WebAPI\\WebAPI\\Models\\Model1.Context.cs:line 65\r\n at WebAPI.Controllers.CUSTOMERsController.<PostCUSTOMER>d__4.MoveNext() in C:\\Users\\[user]\\Desktop\\[folder]\\WebAPI\\WebAPI\\WebAPI\\Controllers\\CUSTOMERsController.cs:line 88\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
API通过控制器和模型使用以下方法发布字符串。
// POST: api/CUSTOMERs
[ResponseType(typeof(CUSTOMER))]
public async Task<IHttpActionResult> PostCUSTOMER(CUSTOMER cUSTOMER)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.CUSTOMERs.Add(cUSTOMER);
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (CUSTOMERExists(cUSTOMER.CUSTOMER_ID))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtRoute("DefaultApi", new { id = cUSTOMER.CUSTOMER_ID }, cUSTOMER);
}
=============================================================================
namespace WebAPI.Models
{
using System;
using System.Collections.Generic;
public partial class CUSTOMER
{
public decimal CUSTOMER_ID { get; set; }
public string CUSTOMER_USERNAME { get; set; }
public string CUSTOMER_PASSWORD { get; set; }
public string CUSTOMER_NAME { get; set; }
public string CUSTOMER_EMAIL { get; set; }
}
}
标题很好,因为我正在使用apirequest.io来帮助我调试,但我不完全确定出了什么问题。
尝试将实体模型与控制器分开。
为实体模型创建模型副本,并检查如下:
public async Task<IHttpActionResult> PostCUSTOMER(CUSTOMERDTO dto)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (dto != null)
{
CUSTOMER cust = new CUSTOMER();
//write code to assign dto to cust object
db.CUSTOMERs.Add(cust);
}
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (CUSTOMERExists(dto.CUSTOMER_ID))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtRoute("DefaultApi", new { id = dto.CUSTOMER_ID }, dto);
}
public class CUSTOMERDTO
{
public decimal CUSTOMER_ID { `enter code here`get; set; }
public string CUSTOMER_USERNAME { get; set; }
public string CUSTOMER_PASSWORD { get; set; }
public string CUSTOMER_NAME { get; set; }
public string CUSTOMER_EMAIL { get; set; }
}
我不可避免地想通了, apirequest.io发出的请求被头文件application/x-www-form-urlencoded
覆盖了。 切换到邮递员为我工作测试API调用。
请务必仔细检查Chrome或Firefox的网络工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.