简体   繁体   中英

swagger.json paths and definitions are empty. No operations defined in spec

I am developing a .netcore web application. I am using of swagger and I've made all the necessary adjustments. Unfortunately it does not work and I just see No operations defined in spec! in the swagger output page.

The swagger file with /swagger/v1/swagger.json has the following content:

{
  "swagger": "2.0",
  "info": {
    "version": "v1",
    "title": "Something"
  },
  "paths": {},
  "definitions": {}
}

I want to see my controllers and their actions in swagger output page.

after some research i was found that my problem was about using swagger along with OData in .NetCore2.1. i found a solution for this problem.

first i added two following Nuget packages:

Swashbuckle.AspNetCore
Swashbuckle.AspNetCore.Annotations

then, i added following codes in Startup.cs

services.AddMvc(options => {
                foreach (var outputFormatter in 
options.OutputFormatters.OfType<ODataOutputFormatter>().Where(_ => 
_.SupportedMediaTypes.Count == 0))
                {
                    outputFormatter.SupportedMediaTypes.Add(new 
MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
                }
                foreach (var inputFormatter in 
options.InputFormatters.OfType<ODataInputFormatter>().Where(_ => 
_.SupportedMediaTypes.Count == 0))
                {
                    inputFormatter.SupportedMediaTypes.Add(new 
MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
                }
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

the, i added following code line in controllers:

[ApiExplorerSettings(IgnoreApi = false)] 

please note that it was worked for me but it may be need more research for eventually side effects

Please add a in contoller any method like a then showing swagger methods

  [HttpGet]
    [EnableQuery]
    public IQueryable<int> Get()
    {
        return 1;
    }

Sounds like you need to add some routes in the controller. With rest services you will need to add them separate from what was built automatically by Visual Studio. for example // GET: Items [HttpGet] [Route("/items")] ...rest of function... this will give your swagger a reference to what it does when you click the button.

you need to enable XML Documentation file under project obtions => Build tab.

Then you need to read this file through swagger so that swagger can create documentation from it.

private static string[] XmlCommentsFilePath
{
    get
    {
        var basePath = PlatformServices.Default.Application.ApplicationBasePath;

        var apiDocFile = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml";
        var apiPath = Path.Combine(basePath, apiDocFile);

        return new[] {apiPath};

    }
}

In ConfigureServices

services.AddSwaggerGen(options =>
{ 
    var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();

    // add a swagger document for each discovered API version
    provider.ApiVersionDescriptions.ForEach(x => options.SwaggerDoc(x.GroupName, CreateInfoForApiVersion(x)));

    ....
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM