【问题标题】:Asp.Net Core odata not recognizing Get action method in a controllerAsp.Net Core odata 无法识别控制器中的 Get 操作方法
【发布时间】:2020-12-03 04:57:21
【问题描述】:

我们在 Asp.Net Core 3.1 上使用 Odata 7.4.1,当我们使用 Get 操作方法添加新控制器时,它不起作用。

Odata 路由构建器:

app.UseMvc(
            routeBuilder =>
            {
                // the following will not work as expected
                // BUG: https://github.com/OData/WebApi/issues/1837
                // routeBuilder.SetDefaultODataOptions( new ODataOptions() { UrlKeyDelimiter = Parentheses } );
                routeBuilder.ServiceProvider.GetRequiredService<ODataOptions>().UrlKeyDelimiter = Parentheses;

                // global odata query options
                routeBuilder.Count();

                routeBuilder.MapVersionedODataRoutes("odata", "api/v{version:apiVersion}", modelBuilder.GetEdmModels());
            });

模型配置:

public class ServiceModelConfiguration : IModelConfiguration
{
    /// <summary>
    /// Applies model configurations using the provided builder for the specified API version.
    /// </summary>
    /// <param name="builder">The <see cref="ODataModelBuilder">builder</see> used to apply configurations.</param>
    /// <param name="apiVersion">The <see cref="ApiVersion">API version</see> associated with the <paramref name="builder"/>.</param>
    public void Apply(ODataModelBuilder builder, ApiVersion apiVersion)
    {
        var services = builder.EntitySet<Service>("SM").EntityType;

        services.HasKey(p => p.Id);

        if (apiVersion <= ApiVersions.V1)
        {
            // This is how we maintain backwards compatibility without having to explicitly
            // version our contract api models
            //store.Ignore(p => p.Email);
        }

        // see https://github.com/microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/SwaggerODataSample
        // for more examples
    }
}

模型类:

public class Service
{
    public int Id { get; set; }
    public string name { get; set; }
}

Odata 安装程序 - Api Explorer 选项:

options.QueryOptions.Controller<V1.ServicesController>()
                                    .Action(f => f.Get(default))
                                        .Allow(Skip | Count)
                                        .AllowTop(100)
                                        .AllowOrderBy("name");

服务控制器:

 /// <summary>
    /// Gets all services
    /// </summary>
    /// <param name="options">The current OData query options.</param>
    /// <returns>All available stores.</returns>
    /// <response code="200">The successfully retrieved stores.</response>
    [Produces("application/json")]
    [ProducesResponseType(typeof(Service), Status200OK)]
    //[Cached(600)]
    public async Task<IActionResult> Get(ODataQueryOptions<Models.Service> options)
    {
        _logger.LogInformation($"Hit: Stores: Get()");
        
        return Ok(new Service { Id = 123, name = "qqq" });
    }

当我们运行这段代码时,swagger 会打开,但无法识别 GET 方法,也无法在邮递员中工作:

预期:

GET /api/v1/services

【问题讨论】:

    标签: asp.net-core swagger odata http-get


    【解决方案1】:

    问题是实体集名称应该指向控制器名称。 下面的行修复了它: var services = builder.EntitySet("Services").EntityType;

    【讨论】:

    • 缺少实体集也是我的猜测
    猜你喜欢
    • 2014-09-29
    • 2014-09-29
    • 2022-08-17
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2018-11-11
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多