问题
I'm trying to generate a swagger doc for my rest API. .net core 3. I've searched other questions on this here and can't seem to find any suggestions that work. The controller is VERY simple, no abstracts, generics, all methods have http attributes, etc.
I've tried swashbuckle v4 packages and also the v5 rc2 packages. the v4 packages just cause a runtime exception in .net core on load. the v5 packages always generate a null reference exception in the .json file. The controller is coded and works fine, was just adding documentation to it. Just wondering if swashbuckle works with .net core 3 yet.
//Register the Swagger generator, defining one or more Swagger documents
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Version = "v1",
Title = "SimpleRESTServer-mySQL",
Description = "A simple example ASP.NET Core REST API using mySql",
TermsOfService = new Uri("https://example.com/terms"),
Contact = new OpenApiContact
{
Name = "blah blah",
Email = string.Empty,
Url = new Uri("https://example.com"),
},
License = new OpenApiLicense
{
Name = "Use under LICX",
Url = new Uri("https://example.com/license"),
}
});
});
and
// Register the Swagger generator and the Swagger UI middlewares
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "SimpleRESTServer-mySQL");
c.RoutePrefix = ""; // make default home page load the swagger doc
});
on swagger page:
Failed to load API definition.
Errors
Hide
Fetch errorInternal Server Error /swagger/v1/swagger.json
on json file itself:
NullReferenceException: Object reference not set to an instance of an object. Swashbuckle.AspNetCore.SwaggerGen.TypeExtensions.IsNullable(Type type) Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ArraySchemaGenerator.GenerateSchemaFor(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.ChainableSchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.CreateResponseMediaType(Type type, SchemaRepository schemaRespository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator+<>c__DisplayClass19_0.b__2(string contentType) System.Linq.Enumerable.ToDictionary(IEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) System.Linq.Enumerable.ToDictionary(IEnumerable source, Func keySelector, Func elementSelector) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateResponse(string statusCode, ApiResponseType apiResponseType, IEnumerable methodAttributes, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateResponses(ApiDescription apiDescription, IEnumerable methodAttributes, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperation(ApiDescription apiDescription, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperations(IEnumerable apiDescriptions, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GeneratePaths(IEnumerable apiDescriptions, SchemaRepository schemaRepository) Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(string documentName, string host, string basePath) Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.SetRoutingAndContinue(HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context) ``
回答1:
Try to:
- Exclude TermsOfService, Contact, License - from SwaggerDoc.
- Exclude RoutePrefix from UseSwaggerUI.
回答2:
Removing ArrayList from my source code solved the issue.
I found this out accidentally by making a code change to solve a completely unrelated issue, see:
Serializing to XML ArrayList<T> in .NET Core 3
😜
来源:https://stackoverflow.com/questions/57649146/has-anyone-gotten-swashbuckle-to-work-with-net-core-3-yet