2015-10-20 2 views
0

У меня есть 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); 
    } 

У кого-нибудь есть идея?

ответ

0

Из сообщения об ошибке кажется, что вы хотите исправить сложное свойство типа. Тем не менее, он пока не поддерживается в OData Web API. см. связанную с этим проблему: https://github.com/OData/WebApi/issues/135

Спасибо.

+0

Смешно, что PATCH для заказа уже работал. Я думаю, что это сломалось, когда мы изменили некоторые вещи в конфигурации запуска. –

+0

:) Первоначально поддерживается исправление для объекта. –

+0

Из вопроса это звучит как 'Order' _is_ сущность, так как имеет свойство' Id'. – lencharest