首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在IIS中运行“swagger.json”时出现“404”错误

在IIS中运行“swagger.json”时出现“404”错误
EN

Stack Overflow用户
提问于 2022-02-09 11:43:38
回答 1查看 1.6K关注 0票数 0

我有一个基本的asp.net核心5.0WebAPI。我安装了Swashbuckle.ASPNetCore swagger-5.6.3 nuget软件包。

这是我的startup.cs。

startup.cs:

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
{
    #region Api Versioning
    services.AddVersioning();
    #endregion
    #region Swagger
    services.AddSwagger();
    #endregion
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IApiVersionDescriptionProvider provider, UserManager<ApplicationUser> userManager, RoleManager<ApplicationRole> roleManager)
{
    app.UseMiddleware<ExceptionMiddleware>();
    app.UseStatusCodePagesWithReExecute("/errors/{0}");
    #region Swagger
    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseVersionedSwagger(provider);
    #endregion
    #region CORS
    app.UseCors("AllowAllOrigins");
    #endregion
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

以下是详细信息:

代码语言:javascript
运行
复制
public static class ApiVersioningExtension
{
    public static IServiceCollection AddVersioning(this IServiceCollection services)
    {
        services.AddApiVersioning(
            options =>
            {
                options.ReportApiVersions = true;
            });
        services.AddVersionedApiExplorer(
            options =>
            {
                options.GroupNameFormat = "'v'VVV";
                options.SubstituteApiVersionInUrl = true;
            });

        return services;
    }
}

private static string XmlCommentsFilePath
{
    get
    {
        var basePath = PlatformServices.Default.Application.ApplicationBasePath;
        var fileName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml";
        return Path.Combine(basePath, fileName);
    }
}

public static IServiceCollection AddSwagger(this IServiceCollection services)
{
    services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();

    services.AddSwaggerGen(options =>
    {
        options.OperationFilter<SwaggerDefaultValues>();

        options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
        {
            Scheme = "Bearer",
            Description = @"JWT Authorization header using the Bearer scheme. <br><br> 
              Enter 'Bearer' [space] and then your token in the text input below.
              <br><br>Example: 'Bearer 12345abcdef'",
            Name = "Authorization",
            In = ParameterLocation.Header,
            Type = SecuritySchemeType.Http
        });

        options.OperationFilter<SwaggerAuthorizeCheckOperationFilter>();

        // integrate xml comments
        options.IncludeXmlComments(XmlCommentsFilePath);
    });

    return services;
}

public static IApplicationBuilder UseVersionedSwagger(this IApplicationBuilder app, IApiVersionDescriptionProvider provider)
{
    app.UseSwagger();
    app.UseSwaggerUI(
        options =>
        {
            foreach (var description in provider.ApiVersionDescriptions)
            {
                options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
            }
        });

    return app;
}

public class SwaggerDefaultValues : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var apiDescription = context.ApiDescription;

        operation.Deprecated |= apiDescription.IsDeprecated();

        if (operation.Parameters == null)
        {
            return;
        }

        foreach (var parameter in operation.Parameters)
        {
            var description = apiDescription.ParameterDescriptions.First(p => p.Name == parameter.Name);

            if (parameter.Description == null)
            {
                parameter.Description = description.ModelMetadata?.Description;
            }

            if (parameter.Schema.Default == null && description.DefaultValue != null)
            {
                parameter.Schema.Default = new OpenApiString(description.DefaultValue.ToString());
            }

            parameter.Required |= description.IsRequired;
        }
    }
}

当我在IIS Express上运行这个程序时,swagger运行得很好。然后我把这个部署到IIS,我得到404找不到。

这样做是可行的:

http://localhost/myapp/swagger/v1/swagger.json

但,

http://localhost/myapp/swagger/index.html

给出错误:

错误隐藏Fetch errorNot Found /swagger/v1/swagger.json

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-09 12:17:11

对于您的情况,您可以这样做,以便为IIS配置Swagger

代码语言:javascript
运行
复制
options.SwaggerEndpoint($"../swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71048989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档