すべて。 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のようになります。
現在、スワッシュバックルはそのようにはまったく機能しません。
私はどこでも見ようとしましたが、私が見つけたすべては回避策です。
c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + VirtualPathUtility.ToAbsolute("~/").TrimEnd('/'));
残念ながら機能しません。今は機能するはずです。何か変更するだけでいいのですが、このプロパティが何を期待し、何に設定するべきかさえわかりません。
当てはまらない場合もあります。セットアップに他の何かが必要な場合や、スワッシュバックルのコード変更が必要な場合があります。
ご支援いただければ幸いです。私は本当に休息のドキュメントとしてswagger(およびswashbuckle)が好きになり始めました。
スワッシュバックル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にホスト名を配置し、そこからラムダを読み取らせることができます。