asp 需要 apiversioning 版本的 net core 中间件
asp net core Middleware that needs apiversioning version
我有一个带有 API 版本控制的 MVC net core 2.2 应用程序。对于 api 或更高版本的 v2,我只希望中间件 运行。
我写的中间件 class 使用 IApiVersionReader.Read()
,但是直到 Startup
中的 UseMVC
行之后才填充它。
var apiVersion = _apiVersionReader.Read(_httpContextAccessor.HttpContext.Request);
所以如果我在 UseMVC
之前注册了我的中间件,那么它就无法使用版本控制方法读取版本。
但是如果我把我的中间件放在 UseMVC
行之后,那么它根本不会触发。
感觉鸡生蛋蛋生鸡!我怎样才能让它工作?
为简洁起见,这是我的启动的简化版本。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(config =>
{
// Don't add auth in development.
if (!CurrentEnvironment.IsDevelopment())
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
}
}
);
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters(config =>
config.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
services.AddApiVersioning(options =>
{
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(2, 0);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc();
app.UseMiddleware(typeof(UserDataLoggingMiddleware));
}
我可以想到几个选项
您可以通过 _httpContextAccessor.HttpContext.Request.Path
手动获取 URL 中的版本,或者如果它在 headers 中,则 _httpContextAccessor.HttpContext.Request.Headers
注册中间件时使用UseWhen
。这将配置中间件管道。你想要的是一个重新加入的分支。有关分支中间件的更多信息,请参阅这篇很棒的文章 -> https://thomaslevesque.com/2018/03/27/understanding-the-asp-net-core-middleware-pipeline/
在 Github 页面上得到了回复。
API 版本控制自动注册它的中间件纯粹是为了简单。要自己控制行为,请执行以下操作:
首先,选择退出自动注册:
services.AddApiVersioning(options => options.RegisterMiddleware = false);
然后,根据需要在管道中注册中间件:
services.UseApiVersioning();
services.UseMvc();
希望对您有所帮助。
我有一个带有 API 版本控制的 MVC net core 2.2 应用程序。对于 api 或更高版本的 v2,我只希望中间件 运行。
我写的中间件 class 使用 IApiVersionReader.Read()
,但是直到 Startup
中的 UseMVC
行之后才填充它。
var apiVersion = _apiVersionReader.Read(_httpContextAccessor.HttpContext.Request);
所以如果我在 UseMVC
之前注册了我的中间件,那么它就无法使用版本控制方法读取版本。
但是如果我把我的中间件放在 UseMVC
行之后,那么它根本不会触发。
感觉鸡生蛋蛋生鸡!我怎样才能让它工作?
为简洁起见,这是我的启动的简化版本。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(config =>
{
// Don't add auth in development.
if (!CurrentEnvironment.IsDevelopment())
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
}
}
);
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters(config =>
config.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
services.AddApiVersioning(options =>
{
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(2, 0);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc();
app.UseMiddleware(typeof(UserDataLoggingMiddleware));
}
我可以想到几个选项
您可以通过
_httpContextAccessor.HttpContext.Request.Path
手动获取 URL 中的版本,或者如果它在 headers 中,则_httpContextAccessor.HttpContext.Request.Headers
注册中间件时使用
UseWhen
。这将配置中间件管道。你想要的是一个重新加入的分支。有关分支中间件的更多信息,请参阅这篇很棒的文章 -> https://thomaslevesque.com/2018/03/27/understanding-the-asp-net-core-middleware-pipeline/
在 Github 页面上得到了回复。
API 版本控制自动注册它的中间件纯粹是为了简单。要自己控制行为,请执行以下操作:
首先,选择退出自动注册:
services.AddApiVersioning(options => options.RegisterMiddleware = false);
然后,根据需要在管道中注册中间件:
services.UseApiVersioning();
services.UseMvc();
希望对您有所帮助。