Я реализую ODataController . Это OData V3 из соображений совместимости с Breeze.js:

using System.Web.Http.OData;
public class OffersController : ODataMetadataController
{
    ...

Где-то посередине я хочу реализовать слияние / патч, как показано в примерах:

[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] int key, Delta<BOOffer> delta)
{
    ...

По какой-то причине я получаю следующую ошибку:

MediaTypeFormatter недоступен для чтения объекта типа «Delta`1» из содержимого с типом мультимедиа «application / json»;

В порядке. Delta <> связана с OData, для этого мне понадобится средство форматирования OData.

Итерируя через средства форматирования (как на этой странице), он похоже, там нет форматировщика OData:

JsonMediaTypeFormatter
    CanReadType: True
    CanWriteType: True
    Base: BaseJsonMediaTypeFormatter
    Media Types: application/json, text/json
XmlMediaTypeFormatter
    CanReadType: True
    CanWriteType: True
    Base: MediaTypeFormatter
    Media Types: application/xml, text/xml
FormUrlEncodedMediaTypeFormatter
    CanReadType: False
    CanWriteType: False
    Base: MediaTypeFormatter
    Media Types: application/x-www-form-urlencoded
JQueryMvcFormUrlEncodedFormatter
    CanReadType: True
    CanWriteType: False
    Base: FormUrlEncodedMediaTypeFormatter
    Media Types: application/x-www-form-urlencoded

Следует ли мне регистрировать этот форматтер? Разве это не должно быть автоматическим? Если мне нужно зарегистрировать его вручную, как?

Если я изменю форму входного параметра Delta на BOOffer , метод будет вызван, но поскольку отправляются только измененные свойства, это не то, что я могу использовать.

Я настраиваю свой контроллер в app_start следующим образом:

System.Web.Http.OData.Builder.ODataConventionModelBuilder builderV3 = new System.Web.Http.OData.Builder.ODataConventionModelBuilder();
var entitySetConfigV3 = builderV3.EntitySet<BOOffer>("Offers");
entitySetConfigV3.EntityType.HasKey(o => o.ID);

config.Routes.MapODataServiceRoute(
    routeName: "odata/v3", 
    routePrefix: "odata/v3",
    model: builderV3.GetEdmModel(),
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
0
vinczemarton 1 Сен 2014 в 14:41

1 ответ

Лучший ответ

Причиной этого была ссылка на System.Web.Http.OData (odatav3) и System.Web.OData (odatav4) в проекте и смешивание ссылок.

System.Web.Http.OData.Formatter.ODataMediaTypeFormatter не настроен для возможности сериализации в System.Web.OData.Delta<T>.

Использование to System.Web.Http.OData.Delta работало по назначению.

Будьте осторожны, ссылаясь на разные версии OData в одном проекте.

1
vinczemarton 1 Сен 2014 в 19:30