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

ServiceStack V4元数据索引页-重命名操作名称时出现问题

/metadata页面显示您可以访问的操作的元数据。当DebugMode=true时,它将显示所有操作,但到详细信息页面的链接将被禁用。当DebugMode=false时,这些服务将被隐藏。

影响服务可见性的属性包括ServiceStack的Restrict属性。