ServiceStack V4元数据索引页 - 无法重命名操作名称

时间:2014-10-02 20:31:39

标签: c# .net servicestack

我一直在自定义元数据页面并遇到一个有趣的问题,在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表明需要在元数据索引页面上启用更深层次的自定义...或者很可能我正在攻击这个自定义问题不正确。

再次感谢辛勤工作:)

约旦

1 个答案:

答案 0 :(得分:0)

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

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

相关问题