限制ServiceStack中自定义内容类型的元数据

时间:2014-01-17 21:48:43

标签: c# servicestack metadata content-type

通过

注册一些自定义内容类型
ContentTypeFilters.Register(contentType, StreamSerializer, StreamDeserializer);

并希望限制元数据页面上路由的显示。这些内容类型仅用于请求dto,仅限InternalNetworkAccess。只是希望不要将面向公众的元数据页面与不必要的东西混为一谈。

对于内置的contentTypes,您只需将其添加到RestrictAttribute下即可。是否有类似的功能隐藏在其他地方,但尚未记录,可能是自定义类型?

看起来像或许我可以自定义MetadataFeature插件,并可能限制哪个请求dto获取内容类型,哪些不然。但我最近才注意到这一点,并且不确定结果如何(也不知道如何删除MetadataFeature并安全地替换为我自己)。

基本上我只希望在元数据页面上可以看到这个自定义内容类型,因为requestDtos仅限于InternalNetworkAccess。 有什么想法吗?

编辑:
我还在使用ServiceStack v3,但仍然对v4的可能性感兴趣。

2 个答案:

答案 0 :(得分:3)

您可以阻止自定义类型显示在元数据中。

如果您的内容类型为application/yourformat,则可以使用:

SetConfig(new HostConfig {
    IgnoreFormatsInMetadata = new HashSet<string>{ "yourformat" }
});

答案 1 :(得分:2)

所以我发现处理元数据请求的初始类是ServiceStack.MetadataFeatureIPlugin。这实际上控制了底层示例请求/响应页面的布局(针对每种内容类型)以及整个“/元数据”页面。

从这个小部分

private IHttpHandler GetHandlerForPathParts(String[] pathParts)
{
    var pathController = string.Intern(pathParts[0].ToLower());
    if (pathParts.Length == 1)
    {
        if (pathController == "metadata")
            return new IndexMetadataHandler();

        return null;
    }
    ...
}

是发送实际“/ metadata”页面的处理程序的地方。在方法<{p>中IndexMetadataHandler的父类BaseSoapMetadataHandler内进一步深入之前,您找不到每个请求的ContentTypes的实际构造

protected override void RenderOperations(HtmlTextWriter writer, IHttpRequest httpReq, ServiceMetadata metadata)

创建一个内部控件(IndexOperationsControl),它有一个方法RenderRow,这是所有魔法发生的地方。在这里你会看到一些明显的“操作”检查(现在是Dto的另一个词)和ContentType喜欢

if (this.MetadataConfig.IsVisible(this.HttpRequest, EndpointAttributesExtensions.ToFormat(config.Format), operation))

所以需要做的就是创建自己的IndexOperationsControl类并处理RenderRow方法中的config.Format。 config.Format就是您注册的ContentType中正斜杠之后的所有内容,因此如果它是“application / x-my-type”,则config.Format String将为“x-my-type”。 Operation只是RequestDto的类名。不幸的是因为类被标记为内部,这意味着你几乎必须完全复制它而不是使用继承。为了与默认情况下生成页面的方式保持1:1的相似性,您还需要内部类ListTemplateTableTemplateXsdTypes的副本(用于构造) IndexOperationsControl)。

在此之后,您只需要自己的IndexMetadataHandler并重载RenderOperations(您可以使用此继承)来创建新的IndexOperationsControl。此外,我们还需要自己的MetadataFeature等效IPlugin,但我们需要完全复制它并修改GetHandlerForPathParts以返回新的IndexMetadataHandler。唯一要做的就是删除MetadataFeature并添加我们自己的插件。

    // removing default metadata feature
    Plugins.RemoveAll(x => x is MetadataFeature);
    // add our custom one
    Plugins.Add(new CustomMetadataFeature());

Voila,您可以按照RequestDto的方式精确显示自定义ContentTypes。