v4 アップデート
v4 ServiceStack には、組み込みのメタデータ ページをカスタマイズする新しい方法がいくつか用意されています。
仮想ファイル システムの使用
ServiceStack の Virtual FileSystem はデフォルトで (つまり、物理ファイルが存在しない場合) フォールバックして、dll 内の埋め込みリソース ファイルを探します。
Config.EmbeddedResourceSources
デフォルトで参照するアセンブリの数と優先順位を指定できます。
- AppHost を含むアセンブリ
- ServiceStack.dll
HtmlFormat
VFS では、カスタマイズしたいメタデータまたはテンプレート ファイルをコピーして次のフォルダーに配置するだけで、組み込みの ServiceStack メタデータ ページとテンプレートを独自のものに完全に置き換えることができるようになりました。
/Templates/HtmlFormat.html // The auto HtmlFormat template
/Templates/IndexOperations.html // The /metadata template
/Templates/OperationControl.html // Individual operation template
メタデータ ページへのリンクの登録
以下を使用して、メタデータ ページに独自のプラグインへのリンクを追加できます。
appHost.GetPlugin<MetadataFeature>()
.AddPluginLink("swagger-ui/", "Swagger UI");
appHost.GetPlugin<MetadataFeature>()
.AddDebugLink("?debug=requestinfo", "Request Info");
AddPluginLink
プラグイン リンクセクションの下にリンクを追加しますが、AddDebugLink
デバッグまたは開発中にのみ使用可能なプラグインで使用できます。
メタデータ属性の使用
Swaggerで使用される同じ属性の多くは、メタデータ ページでも使用されます。
[Api("Service Description")]
[ApiResponse(HttpStatusCode.BadRequest, "Your request was not understood")]
[ApiResponse(HttpStatusCode.InternalServerError, "Oops, something broke")]
[Route("/swagger/{Name}", "GET", Summary = @"GET Summary", Notes = "GET Notes")]
[Route("/swagger/{Name}", "POST", Summary = @"POST Summary", Notes = "Notes")]
public class MyRequestDto
{
[ApiMember(Name="Name", Description = "Name Description",
ParameterType = "path", DataType = "string", IsRequired = true)]
[ApiAllowableValues("Name", typeof(Color))] //Enum
public string Name { get; set; }
}
古い v3 に関する注意事項
ServiceStackの Metadata ページでは、 EndpointHostConfig構成設定 (すべての ServiceStack 構成が存在する場所)を介して限定的なカスタマイズが可能です。たとえば、AppHost の Home ページ Body HTML と Operations Page HTML を次のように変更できます。
SetConfig(new EndpointHostConfig {
MetadataPageBodyHtml = "<p>HTML you want on the home page</p>",
MetadataOperationPageBodyHtml = "<p>HTML you want on each operation page</p>"
});
また、 MoviesRest サンプル プロジェクトで行われているように、[Description] 属性を使用して要求 DTO を属性指定することにより、各 Web サービスにさらにメタデータ ドキュメントを追加することもできます。
[Description("GET or DELETE a single movie by Id. POST to create new Movies")]
[RestService("/movies", "POST,PUT,PATCH,DELETE")]
[RestService("/movies/{Id}")]
public class Movie
{
public int Id { get; set; }
public string ImdbId { get; set; }
public string Title { get; set; }
}
そして、MoviesRest /metadata pageでどのように見えるか。