ASP.NET Core - Swashbuckle没有创建swagger.json文件

Joh*_*ore 38 c# swagger swashbuckle asp.net-core

我无法获得Swashbuckle.AspNetCore(1.0.0)包来生成任何输出.我读过swagger.json文件应该写成'〜/ swagger/docs/v1'.但是,我没有得到任何输出.

我从一个全新的ASP.NET Core API项目开始.我应该提到这是ASP.NET Core 2. API工作,我能够从值控制器中检索值就好了.

我的启动类具有完全如本文所述的配置(GitHub上的Swashbuckle.AspNetCore).

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
            });
        }
        else
        {
            app.UseExceptionHandler();
        }

        app.UseStatusCodePages();
        app.UseMvc();

        //throw new Exception();
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以看到NuGet引用...

在此输入图像描述

同样,这是所有默认模板,但我包含ValuesController以供参考...

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Tia*_*nck 30

我相信你在配置上错过了这两行:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();

    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
    });
}
Run Code Online (Sandbox Code Playgroud)

要访问Swagger UI,URL应为:http:// localhost:XXXX/swagger /

json可以在Swagger UI的顶部找到:

在此输入图像描述

  • 要避免IIS别名问题,请从URL路径中删除/ swagger /.它应该如下所示:app.UseSwaggerUI(c => {c.SwaggerEndpoint("v1/swagger.json","API name");}); (12认同)
  • 现在我也被窃听了.我不知道它是否真的创建了一个文件,或者它是否只是动态生成json并且不保存它. (4认同)
  • 我实际上在env.IsDevelopment行上方有app.UseSwagger,但我将其移至该部分并添加了app.UseSwaggerUI。同样的问题。仍然没有输出。我更新了问题以反映新的代码。 (2认同)
  • 谢谢@ 2b77bee6-5445-4c77-b1eb-4df3e5; 对我来说效果很好。 (2认同)

小智 17

#if DEBUG
   // For Debug in Kestrel
   c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
#else
   // To deploy on IIS
   c.SwaggerEndpoint("/webapi/swagger/v1/swagger.json", "Web API V1");
#endif
Run Code Online (Sandbox Code Playgroud)

部署到IIS时,webapi(基本URL)是应用程序别名.您需要为所有IIS部署保留相同的应用程序别名(基本URL),因为swagger在"/swagger/v1/swagger.json"位置查找swagger.json,但不会在应用程序别名(基本URL)前加上这是它不能工作的原因.

例如:

localhost/swagger/v1/swagger.json - 找不到swagger.json


小智 16

我有同样的问题。检查http:// localhost:XXXX / swagger / v1 / swagger.json。如果遇到任何错误,请修复它们。

例如,我在基本控制器类中有一条歧义的路由,但出现错误:“行为的歧义HTTP方法。行为要求Swagger 2.0具有明确的HttpMethod绑定。” 如果使用基本控制器,请确保您的公共方法使用HttpGet / HttpPost / HttpPut / HttpDelete或Route属性来避免路由不明确。

然后,我也用相同的方法定义了HttpGet(“ route”)和Route(“ route”)属性,这是大摇大摆的最后一个问题。

  • 哦,天哪,你的第一段救了我~!我意识到 swagger.json 不存在的原因是因为我的 API 控制器中有一些错误阻止了 swagger 生成 json 文件。一旦我修复了所有错误,swagger UI 又回来了~!通过查看指向 swagger.json 的 url,它会抛出错误,这对解决问题非常有帮助!!! (3认同)
  • 我有同样的问题,我的删除端点之一没有完全实现并使用 Route 属性。一旦我将该端点的 Route 属性更改为 HttpDelete,错误就消失了。谢谢@Marisol (2认同)

k.e*_*rer 16

在看了答案并检查了建议之后,我最终不知道出了什么问题。

我真的尝试了一切。因此,如果您最终遇到相同的情况,请理解问题可能是其他问题,与大张旗鼓完全无关。

在我的情况下是一个OData例外。

这是程序:

1)导航到localhost:xxxx/swagger
2)打开开发人员工具
3)单击控制台中显示的错误,您将看到导致问题的内部异常。


小智 14

如果您的应用程序托管在IIS / IIS Express上,请尝试以下操作:

c.SwaggerEndpoint("../swagger/v1/swagger.json", "MyAPI V1");
Run Code Online (Sandbox Code Playgroud)


小智 12

我遇到了一个类似但不完全相同的问题.希望这有助于其他人.

我使用的是自定义文档标题,并没有更改SwaggerEndPoint中的文件夹路径以匹配文档标题.如果将端点指向swagger/v1/swagger.json,则无法在swagger UI中找到json文件.

例:

services.AddSwaggerGen(swagger =>
        {
            swagger.SwaggerDoc("AppAdministration", new Info { Title = "App Administration API", Version = "v1.0" });

        });


 app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/AppAdministration/swagger.json", "App Administration");
        });
Run Code Online (Sandbox Code Playgroud)


2b7*_*3e5 12

我正在将我的评论移至答案,因为它似乎有帮助。


为避免 IIS 别名出现问题,请从 URL 路径中删除 /swagger/。它应该是这样的:

app.UseSwaggerUI(c => { c.SwaggerEndpoint("v1/swagger.json", "API name"); });
Run Code Online (Sandbox Code Playgroud)


Moh*_*ast 7

您必须遵守2条规则:

  1. 装饰有明确的HTTP方法像所有的动作[HttpGet("xxx")][HttpPost("xxx")]或...代替[Route("xxx")]
  2. [NoAction]Attribute 装饰控制器中的公共方法。

请注意,http:// localhost:XXXX / swagger /页面请求http:// localhost:XXXX / swagger / v1 / swagger.json文件,但是如果您不遵守上述规则,则Swagger会发生异常。


Ram*_*Ram 7

如果您的控制器有任何问题无法映射到唯一的 URL,您会收到此错误。

查找问题原因的最佳方法是从项目中排除所有控制器。然后尝试通过一次启用一个控制器或一个或多个控制器中的方法来运行应用程序,以查找有问题的控制器/控制器方法。或者你可以变得聪明并做一个二分搜索逻辑来找到禁用启用多个控制器/方法来找到错误的。

一些原因是

  1. 在没有 HTTP 方法属性的控制器中有公共方法

  2. 如果您不使用基于“[action]”的映射,则具有多个具有相同 Http 属性的方法可以映射到相同的 api 调用

  3. 如果您使用版本控制,请确保您在所有控制器版本中都有该方法(如果使用继承,即使您使用的是基础)


Lui*_*oza 6

使用 Swagger 时常犯的一个错误是为 (NET ASP) 两个或多个路由赋予相同的名称。这导致 swagger 无法生成 JSON 文件。例如,这是一个错误的方法

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
    return await _wipServices.WipStart(data);
}
Run Code Online (Sandbox Code Playgroud)

具有相同路由名称但不同操作名称的其他操作

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
    return await _wipServices.WipAbort(data);
}
Run Code Online (Sandbox Code Playgroud)

这是一个正确的方法

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
    return await _wipServices.WipStart(data);
}

[HttpPost, Route("Abort")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
    return await _wipServices.WipAbort(data);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

实际上,您只需要通过删除起始反斜杠来修复 swagger url,如下所示:

c.SwaggerEndpoint("swagger/v1/swagger.json", "MyAPI V1");
Run Code Online (Sandbox Code Playgroud)

代替 :

c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
Run Code Online (Sandbox Code Playgroud)


Byr*_*ras 6

请注意,在 Visual Studio 2022 和 .NetCore 6 中,如果您创建新的ASP.NET Core Web App,Program.cs 会对开发环境进行相反的检查。

代替

if (app.Environment.IsDevelopment())
{
   app.UseSwagger();
   app.UseSwaggerUI();
}
Run Code Online (Sandbox Code Playgroud)

你会找到

if (!app.Environment.IsDevelopment())
{
     app.UseExceptionHandler("/Home/Error");
}
// You shoukd add swagger calls here 
app.UseSwagger();
app.UseSwaggerUI();
Run Code Online (Sandbox Code Playgroud)

如果您通过选择模板ASP.NET Core Web API 来创建新项目并选中“启用 OpenAPI 支持”,您将拥有不同的 Program.cs,其中预装了 swagger 包和相关代码。

我花了一些时间才找到这个,希望能帮助别人。


小智 5

我不知道这对某人是否有用,但就我而言,问题是名称的大小写不同。

V1在服务配置中——设置中的V大写字母
v1——v小写

我所做的唯一一件事就是使用相同的外壳并且它起作用了。

大写 V 的版本名称