web-dev-qa-db-ja.com

APIが別のプロジェクト内から提供されている場合、Swashbuckle / SwaggerworkでURLパスを作成するにはどうすればよいですか?

すべて。 Swashbuckleパッケージを使用してWebApi 2を文書化しようとしています。

APIが単独で実行されている場合、つまりlocalhost/api/swaggerがuiに、localhost/api/swagger/docs/v1がjsonになっている場合、すべてがうまく機能します。

ただし、プロダクションアプリは、このプロジェクトのwebapiconfigメソッドを別のglobal.asax.csから実行することにより、この同じWebapiプロジェクトを初期化します-現在はWebプロジェクト(メインアプリケーション)。したがって、api urlはlocalhost/apiではなくlocalhost/web/apiのようになります。

現在、スワッシュバックルはそのようにはまったく機能しません。

  • localhost/api/swaggerは「API.WebApiApplication」をロードできないというエラーを生成します。もちろん
  • localhost/web/swagger = 404
  • localhost/web/api/swagger = 404

私はどこでも見ようとしましたが、私が見つけたすべては回避策です。

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + VirtualPathUtility.ToAbsolute("~/").TrimEnd('/'));

残念ながら機能しません。今は機能するはずです。何か変更するだけでいいのですが、このプロパティが何を期待し、何に設定するべきかさえわかりません。

当てはまらない場合もあります。セットアップに他の何かが必要な場合や、スワッシュバックルのコード変更が必要な場合があります。

ご支援いただければ幸いです。私は本当に休息のドキュメントとしてswagger(およびswashbuckle)が好きになり始めました。

13
Dmitriy

スワッシュバックル5.xの場合:

これは EnableSwaggerと呼ばれるhttpConfigurationの拡張メソッド によって設定されているようです。 Swashbuckle 5.x migration readme SwaggerSpecConfigに置き換わることに注意してください。 SwaggerDocConfig RootUrl()は、特に4.xのResolveBasePathUsing()を置き換えます。

これは以前と同じように機能しますが、最大の変更点は、名前が変更されて SwaggerDocConfig に移動したことです。

public void RootUrl(Func<HttpRequestMessage, string> rootUrlResolver)

readme の例は、簡潔にするために調整されています。

string myCustomBasePath = @"http://mycustombasepath.com";

httpConfiguration
    .EnableSwagger(c =>
        {
            c.RootUrl(req => myCustomBasePath);

            // The rest of your additional metadata goes here
        });

スワッシュバックル4.xの場合:

SwaggerSpecConfig ResolveBasePathUsingを使用して、ラムダに既知のエンドポイントを読み取らせます。

ResolveBasePathUsing:

public SwaggerSpecConfig ResolveBasePathUsing(Func<HttpRequestMessage, string> basePathResolver);

私のAPIはロードバランサーの背後にあり、これはベースアドレスを提供するのに役立つ回避策でした。以下は、ResolveBasePathUsingを使用して既知のベースパスでパスを解決する愚かな例です。

string myCustomBasePath = @"http://mycustombasepath.com";

SwaggerSpecConfig.Customize(c =>
{
    c.ResolveBasePathUsing((req) => myCustomBasePath);
}

明確にするためにエンドポイントをハードコーディングしましたが、どこでも定義できます。 リクエストオブジェクトを使用してリクエストuriをクリーンアップしようとする で、/ apiではなく/ web/apiを指すこともできます。

開発者 この回避策についてコメント 昨年GitHubで:

ラムダは現在のHttpRequest(つまり、指定されたSwagger ApiDeclarationの要求)を受け取り、ApiのbaseUrlとして使用される文字列を返す必要があります。ロードバランスされたアプリの場合、これはロードバランサーのパスを返す必要があります。

デフォルトの実装は次のとおりです。

(req) => req.RequestUri.GetLeftPart(UriPartial.Authority) +  req.GetConfiguration().VirtualPathRoot.TrimEnd('/');

...

Swaggerが提供されているURLは実際のAPIのURLである必要はないため、Swagger仕様では絶対パスが必要です。

...

ラムダにはHttpRequestMessageインスタンスが渡されます...これを使用してRequestUriなどにアクセスできる必要があります。別のオプションとして、web.configにホスト名を配置し、そこからラムダを読み取らせることができます。

16
Anthony Neace