首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换OData有效负载中的@odata前缀

替换OData有效负载中的@odata前缀
EN

Stack Overflow用户
提问于 2017-10-01 23:47:51
回答 1查看 373关注 0票数 2

我需要自定义odata有效负载json内容,例如

代码语言:javascript
运行
复制
{
    "@odata.context": "http://localhost:49644/v1.0/$metadata#Feeds",
    "@odata.count": 6,
    "value": [
        {
            "id": 1,

代码语言:javascript
运行
复制
{
    "@MyCustomdata.context": "http://localhost:49644/v1.0/$metadata#Feeds",
    "@MyCustomdata.count": 6,
    "value": [
        {
            "id": 1,

我使用ODataLib http://odata.github.io/odata.net/

已尝试使用自定义ODataResourceSerializer、ODataResourceSetSerializer

EN

回答 1

Stack Overflow用户

发布于 2018-02-26 19:39:01

我有一些类似的东西,在我的例子中,我需要删除'@‘前缀以保持与遗留项目的兼容性。

为了解决这个问题,我只是从源代码重新编译了Microsoft.OData.CoreMicrosoft.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前缀:

代码语言:javascript
运行
复制
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引用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46514054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档