8

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

例子:

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

4

3 回答 3

9

v4 更新

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

使用虚拟文件系统

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

您可以指定Config.EmbeddedResourceSources默认查看的程序集的数量和优先级:

  • 包含您的 AppHost 的程序集
  • 服务栈.dll

HtmlFormatVFS 现在让您可以通过简单地复制您想要自定义的元数据或模板文件并将它们放在您的文件夹中,用您自己的完全替换内置的 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>"
});

您还可以通过使用带有 [Description] 属性的 Request DTO 为每个 Web 服务添加更多元数据文档,如MoviesRest 示例项目中所做的那样:

[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 页面上的外观。

于 2012-09-10T22:44:29.940 回答
2

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

内容使用嵌入的 HTML 模板交付,也可以替换以进行详细定制。

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

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

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

于 2014-04-08T14:00:20.500 回答
1

在这里寻找见解。不是如何自定义 /metadata 页面,而是如何通过超媒体 API 使用 XHTML 来做同样的事情。

于 2012-09-10T20:59:58.457 回答