如何在IEDMMODEL中的ODATA中指定ODATA中的路由前缀?

发布于 2025-02-09 18:24:13 字数 1918 浏览 2 评论 0原文

我正在将ASP.NET应用程序迁移到ASP.NET核心。我很难正确迁移ODATA中的未结合功能。该代码基于

启动

public class Startup
{
    public void ConfigureServices( IServiceCollection services )
    {
        services.AddRazorPages();
        services.AddControllers().AddOData( opt => opt.AddRouteComponents( "my_route_prefix", GetEdmModel() ) );
    }

    public void Configure( IApplicationBuilder app )
    {
        app.UseDeveloperExceptionPage();
        app.UseRouting();

        app.UseODataRouteDebug();

        app.UseAuthorization();
        app.UseEndpoints( endpoints => endpoints.MapControllers() );
    }

    private static IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>( "Products" );

        var unboundFunction = builder.Function( "CalculateSalary" ).Returns<string>();
        unboundFunction.Parameter<int>( "minSalary" );

        return builder.GetEdmModel();
    }
}

控制器

public class ProductsController : ODataController
{
    [HttpGet]
    [EnableQuery]
    public IActionResult Get()
    {
        return Ok( new List<Product>() { new Product() { Id = 1, Category = "Foo" } } );
    }

    [HttpGet( "CalculateSalary(minSalary={min})" )]
    public string CalculateSalary( int min )
    {
        return $"Unbound function call on CalculateSalary: min={min}";
    }
}

当前未结合函数的路由为〜/calculatesalary(minsalary = {min})。路由前缀my_route_prefix被忽略。

我如何在iedmmodel to 〜/my_route_prefix/carculeateAlateAlary(minSalary = {min})

?我发现的方法是在每个未结合函数的每个httpget属性中预处理前缀:

[HttpGet( "my_route_prefix/CalculateSalary(minSalary={min})" )]

I'm migrating a ASP.NET application to ASP.NET Core. I'm having trouble to properly migrate unbound functions in OData. This code is based on the ODataRoutingSample.

Startup

public class Startup
{
    public void ConfigureServices( IServiceCollection services )
    {
        services.AddRazorPages();
        services.AddControllers().AddOData( opt => opt.AddRouteComponents( "my_route_prefix", GetEdmModel() ) );
    }

    public void Configure( IApplicationBuilder app )
    {
        app.UseDeveloperExceptionPage();
        app.UseRouting();

        app.UseODataRouteDebug();

        app.UseAuthorization();
        app.UseEndpoints( endpoints => endpoints.MapControllers() );
    }

    private static IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>( "Products" );

        var unboundFunction = builder.Function( "CalculateSalary" ).Returns<string>();
        unboundFunction.Parameter<int>( "minSalary" );

        return builder.GetEdmModel();
    }
}

Controller

public class ProductsController : ODataController
{
    [HttpGet]
    [EnableQuery]
    public IActionResult Get()
    {
        return Ok( new List<Product>() { new Product() { Id = 1, Category = "Foo" } } );
    }

    [HttpGet( "CalculateSalary(minSalary={min})" )]
    public string CalculateSalary( int min )
    {
        return 
quot;Unbound function call on CalculateSalary: min={min}";
    }
}

Currently the route for the unbound function is ~/CalculateSalary(minSalary={min}). The route prefix my_route_prefix gets ignored.

How can I configure the route for all unbound functions in a IEdmModel to ~/my_route_prefix/CalculateSalary(minSalary={min})?

The only way I found is to prepend the prefix in every HttpGet attribute of every unbound function:

[HttpGet( "my_route_prefix/CalculateSalary(minSalary={min})" )]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文