2016-11-28 3 views
2

Я использую Servicestack версии 4.0.52.0 и 4.0.0.0 ServiceStack.Api.SwaggerServiceStack.Api.Swagger SwaggerResourcesService исключая Маршруты, начинающиеся с маршрута Параметр

Я определил все маршруты с переменным параметром маршрута в хосте приложения serviceStack производным класс (AppHostBase): метод Настройки

public class AppHost : AppHostBase 
{ 
    public override void Configure(Funq.Container container) 
    { 
     //Infrastructure code goes here 
     .... 

     //Add routes 
     Routes.Add<TestRequestDTO>("/{MyApplicationKey}/TestOperation/", "GET") 
    } 
} 

Хотя эти маршруты видны на странице ServiceStack метаданных, чванство интерфейс не показывает маршруты, начинающиеся с MyApplicationKey; Копаем глубже в кодовую из мы обнаружили, что проблема в методе ServiceStack.Api.Swagger.SwaggerResourcesService.Get:

[AddHeader(DefaultContentType = MimeTypes.Json)] 
    [DefaultRequest(typeof(SwaggerResources))] 
    [Restrict(VisibilityTo = RequestAttributes.None)] 
    public class SwaggerResourcesService : Service 
    { 
     private readonly Regex resourcePathCleanerRegex = new Regex(@"/[^\/\{]*", RegexOptions.Compiled); 
     internal static Regex resourceFilterRegex; 

     internal static Action<SwaggerResourcesResponse> ResourcesResponseFilter { get; set; } 

     internal const string RESOURCE_PATH = "/resource"; 

     public object Get(SwaggerResources request) 
     { 
      var basePath = base.Request.GetBaseUrl(); 

      var result = new SwaggerResourcesResponse 
      { 
       BasePath = basePath, 
       Apis = new List<SwaggerResourceRef>(), 
       ApiVersion = HostContext.Config.ApiVersion, 
       Info = new SwaggerInfo 
       { 
        Title = HostContext.ServiceName, 
       } 
      }; 
      var operations = HostContext.Metadata; 
      var allTypes = operations.GetAllOperationTypes(); 
      var allOperationNames = operations.GetAllOperationNames(); 
      foreach (var operationName in allOperationNames) 
      { 
       if (resourceFilterRegex != null && !resourceFilterRegex.IsMatch(operationName)) continue; 
       var name = operationName; 
       var operationType = allTypes.FirstOrDefault(x => x.Name == name); 
       if (operationType == null) continue; 
       if (operationType == typeof(SwaggerResources) || operationType == typeof(SwaggerResource)) 
        continue; 
       if (!operations.IsVisible(Request, Format.Json, operationName)) continue; 

       CreateRestPaths(result.Apis, operationType, operationName); 
      } 

      result.Apis = result.Apis.OrderBy(a => a.Path).ToList(); 

      if (ResourcesResponseFilter != null) 
       ResourcesResponseFilter(result); 

      return new HttpResult(result) { 
       ResultScope =() => JsConfig.With(includeNullValues:false) 
      }; 
     } 

     protected void CreateRestPaths(List<SwaggerResourceRef> apis, Type operationType, string operationName) 
     { 
      var map = HostContext.ServiceController.RestPathMap; 
      var feature = HostContext.GetPlugin<SwaggerFeature>(); 

      var paths = new List<string>(); 

      foreach (var key in map.Keys) 
      { 
       paths.AddRange(map[key].Where(x => x.RequestType == operationType).Select(t => **resourcePathCleanerRegex.Match**(t.Path).Value)); 
      } 
...... 
} 

Любые намеки о том, как мы можем решить эту проблему? Есть ли способ указать значение MyApplicationKey для Swagger API, когда он делает список ресурсов?

+0

Вы всегда можете отправить запрос на тяну. – mythz

ответ

2

Существует возможность изменить Swagger ответ, указав обычай ResourcesResponseFilter при регистрации SwaggerFeature плагина, например:

Plugins.Add(new SwaggerFeature { 
    ResourceFilterPattern = @"/[^\/\{]*", 
    ResourcesResponseFilter = response => ... 
}); 

который позволит вам изменить Swagger ответ, что Форс UI получает.

+0

Да, ResourcesResponseFilter позволяет нам изменять/фильтровать результаты, полученные методом SwaggerResourcesService Get(), но поскольку я использую {MyApplicationKey} в качестве префикса для каждого моего API-интерфейса, метод Get() SwaggerResourcesService избегает использования этих методов из-за этого ** private readonly Regex resourcePathCleanerRegex = new Regex (@ "/ [^ \/\ {] *", RegexOptions.Compiled); ** regex, и в результате я не получаю ни одного из своих Url в качестве ресурсов в результатах ResourceResponseFilter. –

+0

@DishamParikh вы также можете изменить 'resourcePathCleanerRegex' с помощью [SwaggerFeature.ResourceFilterPattern] (https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Api.Swagger/SwaggerFeature.cs#L52) – mythz

+0

да, но SwaggerFeature.ResourceFilterPattern не является делегатом для resourcePathCleanerRegex, который использовался в методе CreateRestPaths() SwaggerResourcesService, часть кода CreatePaths(), то есть https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Api .Swagger/SwaggerResourcesService.cs # L120, ускоряет {MyApplicationKey} –

 Смежные вопросы

  • Нет связанных вопросов^_^