通过
注册一些自定义内容类型ContentTypeFilters.Register(contentType, StreamSerializer, StreamDeserializer);
并希望限制元数据页面上路由的显示。这些内容类型仅用于请求dto,仅限InternalNetworkAccess
。只是希望不要将面向公众的元数据页面与不必要的东西混为一谈。
对于内置的contentTypes,您只需将其添加到RestrictAttribute
下即可。是否有类似的功能隐藏在其他地方,但尚未记录,可能是自定义类型?
看起来像或许我可以自定义MetadataFeature
插件,并可能限制哪个请求dto获取内容类型,哪些不然。但我最近才注意到这一点,并且不确定结果如何(也不知道如何删除MetadataFeature并安全地替换为我自己)。
基本上我只希望在元数据页面上可以看到这个自定义内容类型,因为requestDtos仅限于InternalNetworkAccess。 有什么想法吗?
编辑:
我还在使用ServiceStack v3,但仍然对v4的可能性感兴趣。
答案 0 :(得分:3)
您可以阻止自定义类型显示在元数据中。
如果您的内容类型为application/yourformat
,则可以使用:
SetConfig(new HostConfig {
IgnoreFormatsInMetadata = new HashSet<string>{ "yourformat" }
});
答案 1 :(得分:2)
所以我发现处理元数据请求的初始类是ServiceStack.MetadataFeature
和IPlugin
。这实际上控制了底层示例请求/响应页面的布局(针对每种内容类型)以及整个“/元数据”页面。
从这个小部分
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的相似性,您还需要内部类ListTemplate
,TableTemplate
和XsdTypes
的副本(用于构造) 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。