Я использую следующие пакеты C # OData в проекте .NET Web Api:
Install-Package Microsoft.AspNet.OData
Install-Package Microsoft.AspNet.WebApi.OData
При следовании примеру Microsoft Использовать открытые типы в OData v4 все кажется работающим должным образом, если открытый тип не содержит дополнительных вложенных открытых сложных типов.
Это означает, что это будет работать нормально:
public class WplController : ODataController
{
private List<AbstractMongoDocument> _documents = new List<AbstractMongoDocument>
{
new AbstractMongoDocument
{
Id = "2",
Meta = new MongoMeta(),
Data = new MongoData
{
Document = new Dictionary<string, object>()
{
{"root_open_type", "This works!" },
}
}
}
};
[EnableQuery]
public IQueryable<AbstractMongoDocument> Get()
{ return _documents.AsQueryable();}
}
Хотя это вызывает исключение
public class WplController : ODataController
{
private List<AbstractMongoDocument> _documents = new List<AbstractMongoDocument>
{
new AbstractMongoDocument
{
Id = "1",
Meta = new MongoMeta(),
Data = new MongoData
{
Document = new Dictionary<string, object>()
{
{"root_open_type", "This works!" },
{"nested_open_type", new Dictionary<string, object>() //Nested dictionary throws exception!
{
{"field1", "value2" },
{"field2", "value2" }
}
}
}
}
}
};
[EnableQuery]
public IQueryable<AbstractMongoDocument> Get()
{ return _documents.AsQueryable();}
}
Исключение выглядит следующим образом:
Произошло исключение System.InvalidOperationException
Сообщение: типу ObjectContent`1 не удалось сериализовать тело ответа для типа контента application / json;odata.metadata = минимальный.
Сообщение: сгенерировано исключение: 'System.InvalidOperationException' в System.Web.OData.dll
Дополнительная информация: Данная модель не содержит тип 'System.Collections.Generic.Dictionary`2 [System.String, System.Object]».
Это можно исправить, добавив следующую строку в ODataConventionModelBuilder
в WebApiConfig.cs
:
builder.ComplexType<Dictionary<string, object>>();
Однако это приводит к следующему ответу OData JSON:
{
"@odata.context": "http://localhost:50477/odata/$metadata#wpl",
"value":
[
{
"Id": "1",
"Meta": {},
"Data":
{
"root_open_type": "This works!",
"nested_open_type":
{
"@odata.type": "#System.Collections.Generic.Dictionary_2OfString_Object",
"Keys":
[
"field1",
"field2"
]
}
}
}
]
}
Как я могу убедиться, что ODate также правильно сериализует вложенные открытые поля?Т.е. мне бы хотелось получить следующий OData JSON:
{
"@odata.context": "http://localhost:50477/odata/$metadata#wpl",
"value":
[
{
"Id": "1",
"Meta": {},
"Data":
{
"root_open_type": "This works!",
"nested_open_type":
{
"field1": "value1",
"field2": "value2"
}
}
}
]
}
Заранее благодарен за любую потенциальную помощь!