Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制ServiceStack中自定义内容类型的元数据_C#_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Metadata_Content Type - Fatal编程技术网 servicestack,metadata,content-type,C#,servicestack,Metadata,Content Type" /> servicestack,metadata,content-type,C#,servicestack,Metadata,Content Type" />

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
an
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;
    }
    ...
}
是发送实际“/元数据”页面的处理程序的位置。在方法中的
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复制一些内部类。