Я пытаюсь отправить некоторые данные через мой API веб-службы ASP.NET, но он выдает исключение DbEntityValidationException, когда я пытаюсь опубликовать строку JSON. Где я ошибаюсь, пытаясь опубликовать свою строку JSON?
Я использовал блок кода это, чтобы помочь мне отладить мою проблему, но он говорит мне, что мои поля обязательны, когда они существуют в строке JSON, почти обрабатывая строку так, как будто ее никогда не существовало. Это позволяет мне узнать, имеет ли тело запроса значение null, но независимо от пар "имя-значение" оно по-прежнему сообщает мне, что поля являются обязательными.
Строка 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. Переключение на Postman помогло мне протестировать вызовы API.
Всегда дважды проверяйте сетевые инструменты Chrome или Firefox.
Попробуйте добавить
[FromBody]вот так:public async Task<IHttpActionResult> PostCUSTOMER([FromBody] CUSTOMER cUSTOMER)