我需要自定义odata有效负载json内容,例如
{
"@odata.context": "http://localhost:49644/v1.0/$metadata#Feeds",
"@odata.count": 6,
"value": [
{
"id": 1,
至
{
"@MyCustomdata.context": "http://localhost:49644/v1.0/$metadata#Feeds",
"@MyCustomdata.count": 6,
"value": [
{
"id": 1,
我使用ODataLib http://odata.github.io/odata.net/
已尝试使用自定义ODataResourceSerializer、ODataResourceSetSerializer
发布于 2018-02-26 19:39:01
我有一些类似的东西,在我的例子中,我需要删除'@‘前缀以保持与遗留项目的兼容性。
为了解决这个问题,我只是从源代码重新编译了Microsoft.OData.Core
和Microsoft.AspNetCore.OData
,然后编辑了ODataJsonLightWriterUtils.WriteInstanceAnnotationName
以更改批注的序列化方式。
请注意,OData WebApi项目使用ODataLib进行序列化,但您需要编译这两者,以便可以将两者作为自定义程序集包含,而不是通常的nuget包。
这些项目的源代码在这里:
https://github.com/OData/Webapi/tree/feature/netcore
https://github.com/OData/odata.net
在我的例子中,我使用的是netcoreapp2.0,ymmv。
您可以将一个设置传递到DI中,以完全删除odata
前缀:
public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//...
var odata_options = new ODataSimplifiedOptions(){ EnableWritingODataAnnotationWithoutPrefix = true};
//...
app.UseMvc(routeBuilder =>
{
routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
// custom routing - ymmv
string odata_route_name = "ODataRoute";
routeBuilder.MapODataServiceRoute(odata_route_name, "data", a =>
{
a.AddService(Microsoft.OData.ServiceLifetime.Singleton, sp => model);
a.AddService<IODataPathHandler>(Microsoft.OData.ServiceLifetime.Singleton, sp => new DefaultODataPathHandler());
a.AddService<IEnumerable<IODataRoutingConvention>>(Microsoft.OData.ServiceLifetime.Singleton, sp => ODataRoutingConventions.CreateDefaultWithAttributeRouting(odata_route_name, routeBuilder));
a.AddService<ODataSerializerProvider>(Microsoft.OData.ServiceLifetime.Singleton, sp => new CIQODataSerializerProvider(sp, loggerFactory));
a.AddService<ODataDeserializerProvider>(Microsoft.OData.ServiceLifetime.Singleton, sp => new DefaultODataDeserializerProvider(sp));
a.AddService<ILoggerFactory>(Microsoft.OData.ServiceLifetime.Singleton, sp => loggerFactory);
a.AddService<ODataSimplifiedOptions>(Microsoft.OData.ServiceLifetime.Singleton, sp => odata_options);
// ... other specifics to my situation
});
routeBuilder.EnableDependencyInjection();
// mvc/api routes ...
});
}
如果编译源项目的工作量太大,我还尝试使用https://github.com/0xd4d/dnSpy来编辑nuget提供的DLL。我认为这会起作用的,你只需要确保所有依赖于ODataLib的包都被移除,这样就可以使用你的直接DLL引用了。
https://stackoverflow.com/questions/46514054
复制相似问题