是否可以自定义ServiceStack /元数据页面?

时间:2012-09-10 00:34:59

标签: api metadata servicestack

我在非标准端口上的负载均衡器后面运行我的站点。在加载/ metadata页面时,它具有我的公共域名,但是托管了应用程序的本地端口,这导致不同格式的链接也会中断。

示例:

有没有办法在输出中自定义这些链接?此外,是否可以自定义页面的其他text / css / etc,以便可以修改它以适应我用于我网站其余部分的模板?

3 个答案:

答案 0 :(得分:9)

v4更新

v4 ServiceStack提供了许多自定义内置元数据页面的新方法:

使用虚拟文件系统

默认情况下,ServiceStack的虚拟文件系统会回退(即没有物理文件时),以便在dll中查找嵌入式资源文件。

您可以使用Config.EmbeddedResourceSources指定其查看的程序集的数量和优先级,默认情况下会这样:

  • 包含AppHost的程序集
  • ServiceStack.dll

VFS现在允许您通过简单地复制要自定义的元数据或HtmlFormat模板文件并将它们放在您的文件夹中来完全替换内置的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的元数据页面允许通过EndpointHostConfig配置设置(所有ServiceStack配置都存在)进行有限的自定义。例如。您可以使用以下命令更改AppHost中的主页正文HTML和操作页面HTML:

SetConfig(new EndpointHostConfig {
    MetadataPageBodyHtml = "<p>HTML you want on the home page</p>",
    MetadataOperationPageBodyHtml = "<p>HTML you want on each operation page</p>"
});

您还可以使用[{3}}中的[描述]属性将请求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 MoviesRest Example project上看起来如何。

答案 1 :(得分:2)

“服务堆栈元数据”页面可完全自定义。您可以使用属性来注释特定属性或服务,同时保留自动生成的内容。

内容使用嵌入式HTML模板提供,也可以替换为详细的自定义。

可以使用以下代码段完全关闭元数据页面,这就是我通常所做的

SetConfig(new HostConfig { 
EnableFeatures = Feature.All.Remove(Feature.Metadata) });

可以从Service Stack Wiki找到更多详细信息。

答案 2 :(得分:1)

查看here了解见解。它不是如何定制/元数据页面,而是更多如何使用XHTML通过超媒体API来做同样的事情。