C# 限制ServiceStack中自定义内容类型的元数据
通过注册一些自定义内容类型C# 限制ServiceStack中自定义内容类型的元数据,c#,servicestack,metadata,content-type,C#,servicestack,Metadata,Content Type,通过注册一些自定义内容类型 ContentTypeFilters.Register(contentType, StreamSerializer, StreamDeserializer); 并希望限制在元数据页上显示路由。这些内容类型仅适用于仅限于InternalNetworkAccess的请求dto。只是希望不要在面向公众的元数据页面上塞满不必要的东西 对于内置内容类型,只需将其添加到RestrictAttribute下即可。是否有一个类似的功能隐藏在其他地方,但没有记录可能是自定义类型 看起
ContentTypeFilters.Register(contentType, StreamSerializer, StreamDeserializer);
并希望限制在元数据页上显示路由。这些内容类型仅适用于仅限于InternalNetworkAccess
的请求dto。只是希望不要在面向公众的元数据页面上塞满不必要的东西
对于内置内容类型,只需将其添加到RestrictAttribute
下即可。是否有一个类似的功能隐藏在其他地方,但没有记录可能是自定义类型
看起来也许我可以定制元数据功能插件
并可能限制哪些请求dto获取内容类型,哪些不获取内容类型。但我只是最近才注意到这一点,并且不确定结果会如何(也不知道如何删除MetadataFeature并安全地替换为我自己的)
本质上,我只希望此自定义contentType在元数据页上对限制为InternalNetworkAccess的RequestDTO可见。
有什么想法吗
编辑:我仍然在ServiceStack v3上,但仍然对v4的可能性感兴趣。您可以使用阻止自定义类型显示在元数据中 如果您的内容类型是
application/yourformat
,您将使用:
SetConfig(new HostConfig {
IgnoreFormatsInMetadata = new HashSet<string>{ "yourformat" }
});
SetConfig(新主机配置){
IgnoreFormatsInMetadata=新哈希集{“yourformat”}
});
所以我发现最初处理元数据请求的类是ServiceStack.MetadataFeature
anIPlugin
。这实际上控制了底层示例请求/响应页面(针对每种内容类型)的布局以及整个“/元数据”页面
从这一小部分
private IHttpHandler GetHandlerForPathParts(String[] pathParts)
{
var pathController = string.Intern(pathParts[0].ToLower());
if (pathParts.Length == 1)
{
if (pathController == "metadata")
return new IndexMetadataHandler();
return null;
}
...
}
是发送实际“/元数据”页面的处理程序的位置。在方法中的IndexMetadataHandler
的父类BaseSoapMetadataHandler
中,您无法找到每个请求的ContentType的实际构造
protected override void RenderOperations(HtmlTextWriter writer, IHttpRequest httpReq, ServiceMetadata metadata)
创建了一个内部控件(indexoperationcontrol
),它有一个方法RenderRow
,这就是所有神奇之处。在这里,您将看到对“Operation”(现在是Dto的另一个词)和ContentType等的一些明显检查
if (this.MetadataConfig.IsVisible(this.HttpRequest, EndpointAttributesExtensions.ToFormat(config.Format), operation))
因此,需要做的就是创建自己的indexoperationcontrol
类,并在RenderRow方法中处理config.Format。config.Format就是您注册的ContentType中正斜杠之后的所有内容,因此如果它是“application/x-my-type”,config.Format字符串将是“x-my-type”。操作只是RequestDto的类名。不幸的是,由于该类被标记为internal,这意味着您必须完全复制它,而不是使用继承。为了保持默认情况下页面生成方式的1:1相似性,您还需要内部类ListTemplate
、TableTemplate
和XsdTypes
(用于构建IndexOperationsControl
)的副本
在此之后,您只需使用自己的IndexMetadataHandler
和重载renderroperties
(您可以对该属性使用继承)即可创建新的IndexOperationsControl
。此外,我们还需要自己的MetadataFeature
等效IPlugin,但我们需要完全复制它并修改GetHandlerForPathParts
以返回新的IndexMetadataHandler
。唯一要做的另一件事是删除MetadataFeature并添加我们自己的插件
// removing default metadata feature
Plugins.RemoveAll(x => x is MetadataFeature);
// add our custom one
Plugins.Add(new CustomMetadataFeature());
瞧,您可以按照每个请求Dto的显示方式精确显示自定义内容类型。因此您不能在使用自定义内容类型的方法上使用
[Restrict(AccessTo=RequestAttributes.Localhost,VisibilityTo=RequestAttributes.Localhost)]
?Dto已经受到限制。因此,当我在公共地址上点击我的页面时,我只看到“外部”DTO,当我在专用网络上点击它时,我在元数据页面上看到“外部”+“内部网络访问”DTO。注册出现在每个元数据页上的自定义内容类型时。我只需要为InternalNetworkAccess DTO显示自定义内容类型。就像我关闭ServiceStack中的SOAP功能一样,元数据页面中不会出现任何SOAP内容。我想做同样的事情,但对于自定义类型。您使用的是v3还是v4?v3。它在v4中有能力吗?我已经在v4中测试过了,它肯定能工作。这可以部分解决问题,但是它会完全忽略它们。我想我将尝试使用MetadataFeature插件,它在其中生成GetHandlerForPathParts。似乎我应该能够让它在某些点忽略内容类型。在v3中也可以这样做。@Nicholi Cool,我不知道这一点。你能给我指一下显示v3忽略格式的文档或源代码吗?我实际上刚刚注意到它正在搜索EndpointHostConfig。它也是在同一个属性名下调用的,IgnoreFormatsInMetadata。我发现您实际上可以定制元数据页面,而无需重新编译所有ServiceStack(yay),这样您就可以选择为哪些RequestDTO显示哪些自定义内容类型。明天某个时候我会把它作为一个答案。只需要从ServiceStack复制一些内部类。