Swagger 页面在 MVC 网络核心中找不到 404

问题描述 投票:0回答:8

我有一个全新的 .NET-Core Web API 项目,我想使用 API 版本控制和 swagger。

当我尝试查看 swagger 页面时,我得到了 404。但是,模板附带的默认 ValuesController 可以工作。

这是我的设置:

启动.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Add API Versioning
        services.AddApiVersioning(
            options =>
            {
                options.DefaultApiVersion = new ApiVersion(1, 0);
                options.AssumeDefaultVersionWhenUnspecified = true;
                options.ReportApiVersions = true;
            });

        // Add Swagger
        string pathToDoc = "RegistriesApi.xml";
        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1",
                new Info
                {
                    Title = "Registries API",
                    Version = "v1",
                    Description = "A simple api to interact with AMA registries information",
                    TermsOfService = "None"
                });

            string filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, pathToDoc);
            options.IncludeXmlComments(filePath);
            options.DescribeAllEnumsAsStrings();
        });
    }
    ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Url Path Rewriter
        RewriteOptions rewriteOptions = new RewriteOptions();
        if (!env.IsDevelopment())
        {
            rewriteOptions.AddRedirectToHttps();
        }
        else
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseRewriter(rewriteOptions);

        // Use MVC
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        // Swagger
        app.UseSwagger(c =>
        {
            c.PreSerializeFilters.Add((swagger, httpReq) => swagger.Host = httpReq.Host.Value);
        });
        app.UseSwaggerUI(
            c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs"); });
    }

ValuesController.cs

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/values")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new[] {"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)
    {
    }
}

此外,这是我安装的所有库的版本:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="2.2.0" />
  <PackageReference Include="Swashbuckle.AspNetCore" Version="2.4.0" />
</ItemGroup>

有人看到我可能做错了什么吗?

c# asp.net-core swagger
8个回答
20
投票

当我创建项目时,我不小心将 .vs 文件夹包含在签入中。当我将其从源代码管理中删除时,无论出于何种原因,swagger 又开始工作了。

不确定解释是针对这个的。


2
投票

以上答案的组合对我有用:

app.UseSwaggerUI(c => {
    c.RoutePrefix = string.Empty;
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Name of Your API v1");
});

1
投票

我刚刚删除了解决方案根目录中的

.vs
文件夹。现在可以了...


1
投票

我发现错误地忘记添加到startup.cs文件(或您在NET 6.0中用于startup.cs的等效文件)后解决了这个问题

在方法配置添加中:

app.UseEndpoints(endpoints =>
{
     endpoints.MapControllers();
});

0
投票

对我来说@Tyler Findlay 解决方案没有成功。但我用了一种对我来说效果很好的不同方式。

  1. 重新创建项目,如果需要保护API,请确保选中“Configure for HTTPS”复选框,基于此选项,一些行代码将添加到startup.cs中
  2. 通过Nuget安装Swashbuckle.AspNetCore.Swagger。
  3. 通过 Nuget 安装 Swashbuckle.AspNetCore.SwaggerGen 和 Swashbuckle.AspNetCore.SwaggerUI。请记住,AspNetCore.Swagger 内部安装了 SwaggerGen 和 UI,但您可以通过 Nuget 添加它。
  4. 编译项目并运行它。

希望这会对某人有所帮助。

更新:URL 可以是 HTTP://localhost:/swagger/ui


0
投票

为了以防万一,请检查 Startup.cs 中的 Configure() 方法,如果不存在,则应添加这些行:

            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Name of Your API v1"));

0
投票

您可以通过在

c.RoutePrefix = string.Empty;
中添加以下代码
app.UseSwaggerUI

来解决这个问题

0
投票

在我的例子中,我使用

builder.Services.AddAuthentication
builder.Services.AddAuthorization
定义了身份验证和授权,但忘记添加它的用法
app.UseAuthentication()
app.UseAuthorization()

© www.soinside.com 2019 - 2024. All rights reserved.