2017-01-20 5 views
3

私は現在、自分のプロジェクトでswaggerを使用していますが、そこには100以上のコントローラがあります。コントローラの数が多いため、UIドキュメントのページを掃除するのにコントローラをロードするのに5分以上かかります。 UIページで特定のコントローラを選択し、それらのオプションのみをロードすることは可能ですか? それ以外の方法では、UIページを高速に読み込むことができますか? 助けてください!swagger-swashbuckle UIで選択したコントローラのみを表示

+1

おそらくコントローラの数が問題であるhttps://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Dummy.Core/App_Start/CachingSwaggerProvider.csからコピーされたこのクラスを使用します。

コンフィグにこれを追加しますか?個別のドメインアプリケーションに統合または分割する。 1つのアプリケーション内の100個のコントローラーは、わずかな臭いを表します。 – benPearce

答えて

1

コントローラのいずれかでApiExplorerSettingsを使用すると、コントローラを完全に無視することも、メソッドを無視することもできます。

[ApiExplorerSettings(IgnoreApi = true)] 
public class MyController 
{ 
    [ApiExplorerSettings(IgnoreApi = true)] 
    public string MyMethod 
    { 
     ... 
    } 
} 
+0

コントローラを動的に選択する必要があります。私は、より魅力的なUIでオプションを持ち、オプションでコントローラーを選択し、それらを動的にロードしたいと考えています。出来ますか? –

2

あなたが実際に発生した後に仕様の一部の要素を削除することができ、そして、彼らはその後、統合され威張っ-UIに含まれませんswashbuckleのドキュメントフィルタを使用します。例えば、以下のようにクラスを作成します。その後、

using System; 
using System.Web.Http.Description; 
using Swashbuckle.Swagger; 

internal class SwaggerFilterOutControllers : IDocumentFilter 
{ 
    void IDocumentFilter.Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer) 
    { 
     foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions) 
     { 
      Console.WriteLine(apiDescription.Route.RouteTemplate); 

      if ((apiDescription.RelativePathSansQueryString().StartsWith("api/System/")) 
       || (apiDescription.RelativePath.StartsWith("api/Internal/")) 
       || (apiDescription.Route.RouteTemplate.StartsWith("api/OtherStuff/")) 
       ) 
      { 
       swaggerDoc.paths.Remove("/" + apiDescription.Route.RouteTemplate.TrimEnd('/')); 
      } 
     } 
    } 
} 

とフィルタを含めるようにSwaggerConfig.csファイルを編集します。コントローラは仕様から削除されているがいること

 GlobalConfiguration.Configuration 
      .EnableSwagger(c => 
        c.DocumentFilter<SwaggerFilterOutControllers>(); 

注、そのような他の項目を結果モデルは依然として仕様に含まれ、依然としてページの読み込み速度が遅くなる可能性があるためです。

コントローラ/モデルのすべてを最初に列挙しているために単純に遅くなる可能性もあります。この場合、これは役に立たないかもしれません。

編集:UIページが表示されるたびに定義全体が再生成されることに気付きました(これはシナリオでは危険になる可能性があります)。幸い、これをキャッシュするのは簡単です(これは大部分の人が実行時に変更してはいけないのですばらしいはずです)。

c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider)); 

をし、臆面もなく

using Swashbuckle.Swagger; 
using System.Collections.Concurrent; 

namespace <your namespace> 
{ 
    public class CachingSwaggerProvider : ISwaggerProvider 
    { 
     private static ConcurrentDictionary<string, SwaggerDocument> _cache = 
      new ConcurrentDictionary<string, SwaggerDocument>(); 

     private readonly ISwaggerProvider _swaggerProvider; 

     public CachingSwaggerProvider(ISwaggerProvider swaggerProvider) 
     { 
      _swaggerProvider = swaggerProvider; 
     } 

     public SwaggerDocument GetSwagger(string rootUrl, string apiVersion) 
     { 
      string cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion); 
      return _cache.GetOrAdd(cacheKey, (key) => _swaggerProvider.GetSwagger(rootUrl, apiVersion)); 
     } 
    } 
} 
+0

ありがとうございます@rory_za。今私のために働いています。どうもありがとうございます。 –

+0

Pleasure @SUBASH。私はそれが今あなたのために働いてうれしいです。これまたは任意の回答があなたの質問を解決した場合は、チェックマークをクリックして[受諾](https://meta.stackexchange.com/q/5234/179419)を検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 –

関連する問題