У меня есть ODataController для более или менее простой функциональности CRUD. GET, POST и DELETE работают нормально, но PATCH всегда возвращает ту же ошибку: 'ODataComplexTypeDeserializer' does not support Read.
OData Patch не работает
Это ModelState Error
. Мой класс и метод выглядит следующим образом:
[ODataRoutePrefix("Orders")]
public class OrdersController : CommonODataController
{
...
[HttpPatch]
[ODataRoute("({key})")]
public async Task<IHttpActionResult> Patch([FromODataUri] Int64 key, Delta<Order> order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (order == null)
{
return BadRequest("Missing order patch information.");
}
// do patching stuff
}
}
Так при вызове пропатчить ModelState
является недействительным и order
является null
.
Это не может быть сложность Order
, поскольку я уже свернул Order
так, чтобы он содержал только Id
. Я также попробовал это с другими объектами.
После некоторых исследований я предполагаю, что это может иметь какое-то отношение к JsonMediaTypeFormatter
. Конфигурация OWIN:
public void Configuration(IAppBuilder app)
{
// create the HttpConfiguration and do not use the GlobalConfiguration with OWIN
HttpConfiguration httpConfiguration = new HttpConfiguration();
httpConfiguration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
app.UseCors(CorsOptions.AllowAll);
IUnityContainer container = new UnityContainer();
// setup dependency injection and register interfaces
RegisterServices(container);
RegisterControllers(container);
// configure JSON formatters
JsonMediaTypeFormatter formatter = httpConfiguration.Formatters.JsonFormatter;
formatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
//formatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
formatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
// register routes
WebApiConfig.Register(httpConfiguration);
ODataConfig.Register(httpConfiguration);
// setup dependency resolver
httpConfiguration.DependencyResolver = new UnityDependencyResolver(container);
app.UseWebApi(httpConfiguration);
}
У кого-нибудь есть идея?
Смешно, что PATCH для заказа уже работал. Я думаю, что это сломалось, когда мы изменили некоторые вещи в конфигурации запуска. –
:) Первоначально поддерживается исправление для объекта. –
Из вопроса это звучит как 'Order' _is_ сущность, так как имеет свойство' Id'. – lencharest