Я реализую 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));
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 в одном проекте.
Похожие вопросы
Новые вопросы
odata
Протокол открытых данных (OData) - это стандартизированный протокол для создания REST API. OData определяет множество передовых методов работы с REST API, включая краткий, ориентированный на гипермедиа формат JSON. Используйте этот тег для всех версий спецификации (v2, v3, v4.x).