ServiceStack V4元数据索引页-重命名操作名称时出现问题
本文关键字:问题 操作 重命名 元数据 V4 索引 ServiceStack | 更新日期: 2023-09-27 18:25:20
我一直在自定义元数据页面,遇到了一个有趣的问题,在IndexPageFilter筛选器事件中,尝试在OperationNames中重命名操作失败(仅当不处于调试模式时!)。
我实际要做的是清除列表,并生成一个新的字符串列表(实际上是超链接),显示路由和动词而不是DTO类名。
例如,"AuthenticateUser"将显示为"POST/authenticate"(但它实际上是一个超链接,指向原始的、仍在工作的AuthenticateUser详细信息页面,类似于api/json/metadata?op=AuthenticateUser)。
有趣的是,当SS中的调试模式设置为true时,它工作得很好:
SetConfig(new HostConfig{DebugMode = true});
但是,当它不是调试模式时,索引页将不会显示任何链接。所以,我想知道我是否偏离了尝试这种类型的定制的基础。。。或者如果这是一个bug,因为它在调试模式下确实工作得很好。
自定义API文档的格式是我们所必需的功能,我们正试图摆脱Swagger(因为缺乏对复杂类型可选参数的支持)。随着最新的V4.32更新,SS原生元数据页面几乎达到了我们可以开始在生产中使用它们的水平。。。
2014年10月3日编辑:
我不确定我是否把问题说清楚了,所以我会再试一次。
这是一个基本的元数据索引页面:https://devlab-api.betasabrina.com/api/metadata
这里的操作是以我们的请求类的名称命名的,但我们不希望它们以这种方式命名,因为我们的许多开发人员不使用ServiceStackClient,他们更喜欢路由或组合。
所以问题是,我如何使(以第一行为例)"AddRemoveServiceDomain"显示为其动词+路由(POST/api/services/{ServiceGuid}/domains/{Domain})?
目前,您可以在调试模式下替换文本,所有操作都会显示出来,但当SS调试模式设置为false时,它将变为空列表。
2014年10月6日编辑
以下是修复索引页上缺少元数据的问题的代码:
private void IndexPageFilter(IndexOperationsControl indexPage)
{
//clear the original OperationNames
indexPage.OperationNames.Clear();
//get a list of the new operation titles names we want to expose, sorted, etc
var sortedPaths = this.RestPaths.Where(r => !string.IsNullOrEmpty(r.AllowedVerbs)).OrderBy(r => r.Path).ThenBy(r => r.AllowedVerbs);
foreach (var s in sortedPaths)
{
//only show routes with verbs
var verbs = s.AllowedVerbs != null ? s.AllowedVerbs.PadRight(10, ' ') : "";
verbs = verbs.Replace(" ", " ");
var pathText = string.Format("{0} {1}", verbs, s.Path);
//create an html link (I know this is a hack... and disables the JSON link)
var link = string.Format("<a href='json/metadata?op={0}' >{1}</a>", s.RequestType.Name, pathText);
indexPage.OperationNames.Add(link);
}
}
现在,如果
SetConfig(new HostConfig{DebugMode = true});
代码SS框架将允许生成这些链接,并按预期显示。。。但是,当Debug=false时,索引页将显示为空(因为OperationNames列表与请求DTO类名不匹配)。
我知道我在做什么操纵索引列表很难。。。但也许这种类型的黑客攻击表明,需要在元数据索引页上启用更深层次的定制。。。或者很可能我错误地攻击了这个定制问题。
再次感谢您的辛勤工作:)
Jordan
/metadata
页面显示您可以访问的操作的元数据。当DebugMode=true
时,它将显示所有操作,但到详细信息页面的链接将被禁用。当DebugMode=false
时,这些服务将被隐藏。
影响服务可见性的属性包括ServiceStack的Restrict属性。