对于一个较旧的网络框架项目,我使用Swashbuckle 5.6.0. 当我使用一个类作为get参数时,会发生一件奇怪的事情.它将变量名添加到参数中.

这意味着API的消费者必须添加"记录".放在每个论点的前面.真的很不方便.

对这种行为的解释是什么?

Here is what it looks like in swagger

The definition in the controller:

这是POCO班级:

  public class AssetTransactionAllAssetsSearchRecord2
    {
        public AssetTransactionAllAssetsSearchRecord2() { }
        
        public long Id { get; set; }
        public DateTime FromCreated { get; set; }
        public DateTime ToCreated { get; set; }
        public long? DocumentId { get; set; }

        public long AssetId { get; set; }
        public long HostingAssetId { get; set; }
        public long SystemAssetId { get; set; }
        public long CustomerAssetId { get; set; }

        public string AssetCode { get; set; }
        public string HostingAssetCode { get; set; }
        public string SystemAssetCode { get; set; }
        public string CustomerAssetCode { get; set; }

        public string AssetName { get; set; }
        public string HostingAssetName { get; set; }
        public string SystemAssetName { get; set; }
        public string CustomerAssetName { get; set; }

    }

以下是Swagger配置:

using System.Web.Http;
using WebActivatorEx;
using VI_Web;
using Swashbuckle.Application;
using Swashbuckle.Swagger;
using System.Collections.Generic;
using System.Web.Http.Description;

[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace VI_Web
{
    class AuthTokenOperation : IDocumentFilter
    {
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            swaggerDoc.paths.Add("/token", new PathItem
            {
                post = new Operation
                {
                    tags = new List<string> { "UserAuth" },
                    consumes = new List<string>
                {
                    "application/x-www-form-urlencoded"
                },
                    parameters = new List<Parameter> {
                    new Parameter
                    {
                        type = "string",
                        name = "grant_type",
                        required = true,
                        @in = "formData",
                        @default = "password"
                    },
                    new Parameter
                    {
                        type = "string",
                        name = "client_id",
                        required = true,
                        @in = "formData"
                    },
                    new Parameter
                    {
                        type = "string",
                        name = "client_secret",
                        required = true,
                        @in = "formData"
                    },
                    new Parameter
                    {
                        type = "string",
                        name = "database",
                        required = true,
                        @in = "formData"
                    }

                }
                }
            });
        }
    }

    public class SwaggerConfig
    {
        public static void Register()
        {
            var thisAssembly = typeof(SwaggerConfig).Assembly;

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                    {
                        c.SingleApiVersion("v1", "VI_Web");
                        c.ApiKey("Token")
                        .Description("Filling bearer token here")
                        .Name("Authorization")
                        .In("header");
                        c.DocumentFilter<AuthTokenOperation>();
                    })
                .EnableSwaggerUi(c =>
                    {
                        c.EnableApiKeySupport("Authorization", "header");
                    });
        }
    }
}

推荐答案

我认为这不是华而不实的问题(假设查询终结点确实有效),而是您的ASP.NET安装程序如何处理作为参数传递的"Complex"类型的GET请求处理程序(record).您可以try 将该类型展平为单独的端点参数:

... GetWithAssets(long id, DateTime fromCreated, ...)

或者,也可以使用Parameter Binding in ASP.NET Web API个文档中提到的FromUriAttribute,基于该示例应该将不带参数名称前缀的类型展平:

... GetWithAssets([FromUri] AssetTransactionAllAssetsSearchRecord2 record)

您还可以将您的端点转换为POST并接受JSON Body,这对于类似搜索的端点来说是非常流行的方法.

Csharp相关问答推荐

如何将MongoDB序列化程序设置为内部对象属性

为什么AggregateException的Catch块不足以处理取消?

Swagger没有显示int?可以为空

VS 2022 for ASP.NET Core中缺少自定义项模板

是否有必要在ASP.NET Core中注册可传递依赖项?

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

将字符串类型日期输入(yyyy-mm-ddthh:mm:ss)转换为MM/dd/yyyy格式

如何将 colored颜色 转换为KnownColor名称?

如何在C#.NET桌面应用程序中动态更改焦点工具上的后退 colored颜色

如何在Xamarin.Forms中检索PanGesture事件的位置?

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

在C#和HttpClient中使用REST API

C#11/.NET 7-判断&t;值类型>;后的可为空性行为

异步实现上的C#同步

单击批准按钮时,如何将所有带值的模型属性传递给批准索引操作?

如果线程在Windows中必须是STA,那么它在Linux或MacOS中工作吗?

在执行API中的代码之前,请判断内存缓存中是否存在JWT令牌

无法访问另一个项目中的本地化资源(WPF、C#)

通过属性和数组内容来区分

在 Visual Studio 2019 中使用 .NET Framework 2.0 的部分方法如何实现这一点?