我一直在自定义元数据页面,并且遇到了一个有趣的问题,其中在IndexPageFilter筛选器事件中,试图重命名OperationNames中的操作失败(仅在调试模式下!)。ServiceStack V4元数据索引页面 - 重命名操作名称
我实际上做的是清除列表,并生成一个新的字符串列表(实际上是超链接),显示路径和动词 INSTEAD DTO类名。
因此,例如,“AuthenticateUser”将显示为“POST/authenticate”(但它实际上是一个超链接,指向原始的,并且仍在工作的AuthenticateUser详细信息页面,如api/json/metadata?op =的authenticateUser)。
有趣的是,它的作品当SS调试模式设置为true就好了:
SetConfig(new HostConfig{DebugMode = true});
然而,当它没有调试模式,索引页将不会显示任何链接。所以,我想知道如果我尝试这种类型的自定义,或者如果这是一个错误,因为它在调试模式下实际上效果很好。
自定义API文档的格式对我们来说是一个必需的特性,我们试图摆脱Swagger(因为缺乏对复杂类型可选参数的支持)。随着最新的V4.32更新时,SS机元数据的页面几乎在一个水平,我们就可以开始在生产中使用它们......在2014年10月3日
编辑:
我不是我确定我明确提出了问题,所以我会再试一次。
这是一个基本的元数据索引页:https://devlab-api.betasabrina.com/api/metadata
在这里操作我们的请求类的名字命名 - 但我们不希望他们这样的命名方式,因为我们的许多开发商不使用ServiceStackClient ,他们更喜欢路线,或者组合。
所以问题是,我怎么做(以第一行为例)“AddRemoveServiceDomain”显示为其动词+ route(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类名称)。
我知道我在做什么操纵索引列表是hacky ...但也许这种类型的黑客攻击表明需要在元数据索引页面上启用更深层次的自定义......或者很可能是我错误地攻击了这个自定义问题。
再次感谢您的辛勤工作:)
乔丹
请提供您的定制元数据页面的副本,以便我们重新处理该问题。 – mythz 2014-10-04 17:14:24