0
我正在努力让Swagger在WebApi中记录多租户路由。我之前曾使用过这种方法,但从未在自己托管的项目中使用过。看来MultipleApiVersions
永远不会被调用 - 当我添加日志代码。MultipleApiVersions不能在OWIN中工作
StatupConfig.cs
public class StartupConfig
{
private static ILog _logger = LogManager.GetLogger(nameof(StartupConfig));
public void Configure(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Filters.Add(new ApiKeyAuthorizationFilter());
config.Filters.Add(new ApiInvocationMetricsFilter());
var assembly = Assembly.GetExecutingAssembly();
var builder = new ContainerBuilder();
builder.RegisterApiControllers(assembly);
builder.RegisterWebApiFilterProvider(config);
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
appBuilder.UseAutofacMiddleware(container);
appBuilder.UseAutofacWebApi(config);
appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
appBuilder.UseWebApi(config);
config
.EnableSwagger(c =>
{
c.MultipleApiVersions(
ResolveVersionSupportByRouteConstraint,
(vc) =>
{
vc.Version("v2", "API v2");
vc.Version("v1", "API v1");
});
c.RootUrl((message) => ConfigurationManager.AppSettings["SwaggerRoot"]);
c.IncludeXmlComments([email protected]"{System.AppDomain.CurrentDomain.BaseDirectory}\API.xml");
c.OperationFilter<AddRequiredApiKeyParameter>();
c.DescribeAllEnumsAsStrings(true);
})
.EnableSwaggerUi(ui =>
{
ui.EnableDiscoveryUrlSelector();
});
}
public static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion)
{
try
{
var versionConstraint = (apiDesc.Route.Constraints.ContainsKey("apiVersion"))
? apiDesc.Route.Constraints["apiVersion"] as ApiVersionConstraint
: null;
return versionConstraint?.AllowedVersion.Split('|').Select(x => x.ToLowerInvariant()).ToList().Contains(targetApiVersion.ToLowerInvariant()) ?? false;
}
catch (System.Exception excep)
{
_logger.Error("An error occurred resolving version support", excep);
throw;
}
}
}
注:
public class ApiVersion2RoutePrefixAttribute : RoutePrefixAttribute
{
private const string RouteBase = "api/{apiVersion:apiVersionConstraint(v2)}";
private const string PrefixRouteBase = "api/{apiVersion:apiVersionConstraint(v2)}/";
public ApiVersion2RoutePrefixAttribute(string routePrefix)
: base(string.IsNullOrWhiteSpace(routePrefix) ? "api/{apiVersion:apiVersionConstraint(v2)}" : "api/{apiVersion:apiVersionConstraint(v2)}/" + routePrefix)
{
}
}
我失去了一些东西在这里:所以我用一个路由约束这早WebApiVersioning?
感谢 KH