2017-07-03 27 views
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

回答

0

这个问题通过确保在Route属性的任何Name参数是解决跨两个控制器的版本是唯一的。我有一个名为Add的操作,两个控制器的Route Name参数都是Add,这就阻止了Swagger的运行。

即此

[Route("", Name = nameof(AddAdvertiser))]

改变这种

[Route("", Name = nameof(V1AddAdvertiser))]

相关问题