我一直在自定义元数据页面并遇到一个有趣的问题,在IndexPageFilter过滤器事件中,尝试重命名OperationNames中的操作失败(仅当不在调试模式时!)。
我实际在做的是清除列表,并生成一个新的字符串列表(实际上是超链接),显示DTO类名称的路由和动词 INSTEAD。
因此,例如,“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”显示为其动词+路由(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 ...但也许这种类型的hack表明需要在元数据索引页面上启用更深层次的自定义...或者很可能我正在攻击这个自定义问题不正确。
再次感谢辛勤工作:)
约旦
答案 0 :(得分:0)
/metadata
页面显示您有权访问的操作的元数据。当DebugMode=true
它将显示所有操作但是将禁用指向详细信息页面的链接。当隐藏DebugMode=false
这些服务时。
影响服务可见性的属性包括ServiceStack的Restrict attributes。