如何解决OpenAPI自动生成的C#服务器引发UriFormatException
我正在尝试使最基本的OpenAPI服务器正常工作。自动生成的python-flask可以正常工作,但查询发生异常的aspnet不能正常工作。
要使aspnet服务器正确响应查询,还需要采取什么额外的步骤?
YAML如下:
openapi: 3.0.0
info:
title: Test API
version: 0.0.0
servers:
- url: http://localhost:{port}
description: Local server
variables:
port:
default: "8092"
paths:
/things:
get:
summary: Return a list of Things
responses:
'200':
description: A JSON array of Things
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Thing"
components:
schemas:
Thing:
properties:
id:
type: integer
name:
type: string
为了使服务器运行,必须从以下位置修改自动生成的launchSettings.json:
...
"web": {
"commandName": "Project","launchBrowser": true,"launchUrl": "swagger","applicationUrl": "https://localhost:5001;http://localhost:5000","environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
...
收件人:
...
"web": {
"commandName": "Project","launchBrowser": false,"applicationUrl": "http://localhost:8092","environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
...
控制台提示服务器运行正常
info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
User profile is available. Using 'C:\Users\jonathan.noble\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
Hosting environment: Development
Content root path: D:\aspnetcore-server-generated\src\IO.Swagger
Now listening on: http://localhost:8092
Application started. Press Ctrl+C to shut down.
但是,当通过http://localhost:8092/things
进行查询(这是招摇过快的编辑器建议使用的方式)时,服务器会抛出
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/1.1 GET http://localhost:8092/things
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HM46UOD2UM1E",Request id "0HM46UOD2UM1E:00000001": An unhandled exception was thrown by the application.
System.UriFormatException: Invalid URI: The URI is empty.
at System.Uri.CreateThis(String uri,Boolean dontEscape,UriKind uriKind)
at System.Uri..ctor(String uriString)
at IO.Swagger.Startup.<ConfigureServices>b__5_2(SwaggerGenOptions c) in D:\aspnetcore-server-generated\src\IO.Swagger\Startup.cs:line 73
at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name,TOptions options)
...
解决方法
通过查看自动生成的代码和示例项目之间的区别, aspnet-core我发现了引起异常的一行代码。
在Program.cs中,需要删除自动生成的代码
c.OperationFilter<GeneratePathParamsValidationFilter>();
我确定它在那里是有原因的,但这会导致基本应用程序失败。
,使用 swagger-codegen-cli
3.0.27 版时,我遇到了同样的错误(我也只是生成最基本的 API 服务器)。事实证明,生成器生成的代码试图用 TermsOfService
中的空字符串实例化 Uri
Startup.ConfigureServices()
对象:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v0",new OpenApiInfo
{
Version = "v0",Title = "Test API Spec",Description = "Test API Spec (ASP.NET Core 3.1)",Contact = new OpenApiContact()
{
Name = "Swagger Codegen Contributors",Url = new Uri("https://github.com/swagger-api/swagger-codegen"),Email = ""
},TermsOfService = new Uri("") // ********** right here **********
});
c.CustomSchemaIds(type => type.FullName);
string xmlPath = Path.Combine(AppContext.BaseDirectory,$"{Assembly.GetExecutingAssembly().GetName().Name}.xml");
c.IncludeXmlComments(xmlPath);
// Include DataAnnotation attributes on Controller Action parameters as Swagger validation rules (e.g required,pattern,..)
// Use [ValidateModelState] on Actions to actually validate it in C# as well!
//c.OperationFilter<GeneratePathParamsValidationFilter>();
});
我刚刚完全删除了 TermsOfService
字段,因此不再抛出错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。