- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有asp.net core webapi。我们添加了 Microsoft.AspNetCore.Mvc.Versioning 和 Swashbuckle 以获得 swagger UI。我们将 Controller 指定为:
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ContactController : Controller
{
当我们运行 swagger ui 时,我们将版本作为路由中的参数:
如何为路由设置默认“v1”?如果版本 2 出现,如何支持两个版本的 swagger ui?
最佳答案
目前 Swashbuckle 和 Microsoft.AspNetCore.Mvc.Versioning 是 friend 。效果很好。我刚刚在 VS2017 中创建了测试项目并检查了它是如何工作的。
首先包含这两个nuget包:
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="1.2.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0" />
在 Startup.cs
中配置所有内容(阅读我的评论):
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Configure versions
services.AddApiVersioning(o =>
{
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
});
// Configure swagger
services.AddSwaggerGen(options =>
{
// Specify two versions
options.SwaggerDoc("v1",
new Info()
{
Version = "v1",
Title = "v1 API",
Description = "v1 API Description",
TermsOfService = "Terms of usage v1"
});
options.SwaggerDoc("v2",
new Info()
{
Version = "v2",
Title = "v2 API",
Description = "v2 API Description",
TermsOfService = "Terms of usage v2"
});
// This call remove version from parameter, without it we will have version as parameter
// for all endpoints in swagger UI
options.OperationFilter<RemoveVersionFromParameter>();
// This make replacement of v{version:apiVersion} to real version of corresponding swagger doc.
options.DocumentFilter<ReplaceVersionWithExactValueInPath>();
// This on used to exclude endpoint mapped to not specified in swagger version.
// In this particular example we exclude 'GET /api/v2/Values/otherget/three' endpoint,
// because it was mapped to v3 with attribute: MapToApiVersion("3")
options.DocInclusionPredicate((version, desc) =>
{
var versions = desc.ControllerAttributes()
.OfType<ApiVersionAttribute>()
.SelectMany(attr => attr.Versions);
var maps = desc.ActionAttributes()
.OfType<MapToApiVersionAttribute>()
.SelectMany(attr => attr.Versions)
.ToArray();
return versions.Any(v => $"v{v.ToString()}" == version) && (maps.Length == 0 || maps.Any(v => $"v{v.ToString()}" == version));
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint($"/swagger/v2/swagger.json", $"v2");
c.SwaggerEndpoint($"/swagger/v1/swagger.json", $"v1");
});
app.UseMvc();
}
有两个类可以实现这一点:
public class RemoveVersionFromParameter : IOperationFilter
{
public void Apply(Operation operation, OperationFilterContext context)
{
var versionParameter = operation.Parameters.Single(p => p.Name == "version");
operation.Parameters.Remove(versionParameter);
}
}
public class ReplaceVersionWithExactValueInPath : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.Paths = swaggerDoc.Paths
.ToDictionary(
path => path.Key.Replace("v{version}", swaggerDoc.Info.Version),
path => path.Value
);
}
}
RemoveVersionFromParameter
从 swagger UI 中删除此文本框:
ReplaceVersionWithExactValueInPath
改变了这一点:
对此:
Controller 类现在如下所示:
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1")]
[ApiVersion("2")]
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)
{
}
[HttpGet("otherget/one")]
[MapToApiVersion("2")]
public IEnumerable<string> Get2()
{
return new string[] { "value1", "value2" };
}
/// <summary>
/// THIS ONE WILL BE EXCLUDED FROM SWAGGER Ui, BECAUSE v3 IS NOT SPECIFIED. 'DocInclusionPredicate' MAKES THE
/// TRICK
/// </summary>
/// <returns></returns>
[HttpGet("otherget/three")]
[MapToApiVersion("3")]
public IEnumerable<string> Get3()
{
return new string[] { "value1", "value2" };
}
}
<小时/>
代码:https://gist.github.com/Alezis/bab8b559d0d8800c994d065db03ab53e
关于c# - 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929916/
我有 ASP.NET Core Web 应用程序,我在其中使用 swagger 使用以下内容: public void ConfigureServices(IServiceCollection ser
AspNetCore.Mvc 和 AspNetCore.Mvc.Core NuGet 包之间有什么区别? Mvc.Core 只是简单的东西,而 Mvc 是一个包罗万象的包吗?这就是我从描述中猜测的he
我有一个包含多个项目的解决方案。我想创建一个项目的Docker镜像,因此我已经通过Docker支持添加了一个Dockerfile。我添加了Dockerfile的项目已在同一级别上依赖于其他项目。当我尝
我正在尝试使用 Ajax 将类列表返回到我的 View 这是我的ajax $(document).ready(function () { debugger; $.
我已经使用过几次这个包Microsoft.AspNetCore.TestHost在我的集成测试中托管 Asp.Net Core Web API 应用程序。 使用 Asp.Net Core 2.1 包
我正在尝试使用 Ajax 将类列表返回到我的 View 这是我的ajax $(document).ready(function () { debugger; $.
SignalR 客户端有两个 nuget 包: Microsoft.AspNetCore.SignalR.Client和 Microsoft.AspNetCore.SignalR.Client.Cor
这个错误的可能原因是什么: InvalidOperationException: No service for type 'Microsoft.AspNetCore.Identity.UserMana
使用 IFormFile 时,我在运行时收到此错误: Could not load type 'Microsoft.AspNetCore.Http.Internal.FormFile' from as
我正在尝试将我的 API 项目从 .net core 2.2 升级到 .net core 3.1。我在尝试进行 API 调用时遇到此异常。 "Message":"Could not load type
我在 netcoreapp3.0 Web 应用程序中使用 netstandard2.1 库。在 Startup 中添加我的服务时,出现以下错误: 'Could not load type 'Micro
我遇到以下异常: Cannot resolve parameter 'Microsoft.Extensions.Logging.ILogger logger' "At the moment (9/28
我们有使用 Swagger 的 .net core 2.1 mvc webapi 项目。 我们使用以下软件包: swashbuckle 的配置方式如下: services.AddMvcCo
我正在使用图书馆 "FluentValidation.AspNetCore": "6.4.0-beta3"在 .netcore WebApi在一个项目中。您可以在下面看到项目结构。如果我放置 Curr
怎么改Content root path在应用程序 .Net Core 3.0 ASP Blazor 上启动? 现在应用程序以输出开始 info: Microsoft.AspNetCore.DataP
我正在将 Microsoft.AspNetCore.Identity 添加到一个项目中,我得到了 InvalidOperationException: Unable to resolve servic
我有一个 Asp.Net Core 2 Mvc 项目。我目前正在尝试将数据访问分离到一个单独的项目中;但是,一旦我添加对数据访问库的引用,我就会遇到版本冲突: error NU1107: Versio
我理解的三大人生: 单例 有范围 短暂的 但我似乎找不到说明默认生命周期是多少(如果未明确定义)的文档。 最佳答案 默认情况下,注册类型的生命周期是 transient 的,即每次注入(inject)
我有一个正在泄漏线程的 ASP.NET Core 2 应用程序。我如何确定线程永不消亡的原因? 如果我在生产环境中运行该应用程序 10 分钟,IIS 开始吐出 502.3 Bad Gateway 错误
当尝试从新的DotNetCore类库导入AspNetCore MVC站点(WebApplication1)以便运行某些测试时,出现以下错误。 任何人都可以对编译器的工作原理以及为什么使用runtime
我是一名优秀的程序员,十分优秀!