C# 使用ServiceStack隐藏输出成员
我正在评估ServiceStack作为我们希望在系统环境中使用的一种可能的REST服务,到目前为止,我对它非常满意。 服务的一个要求是隐藏特定用户或用户组的字段。根据用户拥有的密钥/会话 并非数据模型的所有字段都返回给客户机,它们必须由服务堆栈隐藏。因此,在收到数据对象(列表)后 从Linq2SQL中,我使用反射分析对象,提取对象成员,忽略应该隐藏的成员并添加其他成员 词典的成员。之后,我将字典传递给ServiceStack,ServiceStack将其序列化并将数据结构发送给客户端 我对此设置的问题如下:C# 使用ServiceStack隐藏输出成员,c#,.net,rest,
servicestack,C#,.net,Rest,
servicestack,我正在评估ServiceStack作为我们希望在系统环境中使用的一种可能的REST服务,到目前为止,我对它非常满意。 服务的一个要求是隐藏特定用户或用户组的字段。根据用户拥有的密钥/会话 并非数据模型的所有字段都返回给客户机,它们必须由服务堆栈隐藏。因此,在收到数据对象(列表)后 从Linq2SQL中,我使用反射分析对象,提取对象成员,忽略应该隐藏的成员并添加其他成员 词典的成员。之后,我将字典传递给ServiceStack,ServiceStack将其序列化并将数据结构发送给客户端 我对此设置
- 这是使用ServiceStack的正确方法还是我滥用了 哪些漏洞将很快被修复
- 有没有一种ServiceStack方法可以实现同样的效果
- 你有什么可以推荐的最佳实践吗
- 使用ServiceStack的正确方法是为API定义DTO,而不是尝试使用现有业务对象。如果您的客户机准备解析返回带有dictionary属性的DTO的列表,则可能会起作用
一种“ServiceStack”方法是定义一个简单、平坦的DTO,其中包含所有可能的属性,其中每个属性都可以为null
给定的DTO定义如下:
public class NullablePartials
{
public Int32? Test1 { get; set; }
public String Test2 { get; set; }
public Double? Test3 { get; set; }
}
以下片段:
Dictionary<String, String> MyDtoDictionary = new Dictionary<String, String>();
MyDtoDictionary.Add("Test1", "7");
MyDtoDictionary.Add("Test2", "Value2");
NullablePartials result = MyDtoDictionary.ToJson().FromJson<NullablePartials>();
System.Diagnostics.Debug.WriteLine(MyDtoDictionary.ToJson());
System.Diagnostics.Debug.WriteLine(result.ToJson());
使用ServiceStack.Text作为JSON库的默认设置来序列化空值
关于最佳实践,请参阅,其中讨论了ServiceStack理念。特别是建议使用:
代码优先POCO
由于ServiceStack提倡干净、可重用的代码,所以它一直鼓励在几乎所有事情上使用代码优先的POCO。i、 e.可以使用相同的POCO:
- 在请求和响应DTO中(在客户端和服务器上)
- 在JSON、JSV和CSV文本序列化程序中
- 作为OrmLite中的数据模型,db4o和NHibernate
- 作为存储在Redis中的实体
- 作为存储在缓存和会话中的blob
- 在MQ的服务中删除并执行
- 将复杂结构脱水成
这个问题似乎离题了,因为它是对外部服务的支持请求,应该针对该服务。我不认为这个问题离题了。我对这个问题也很感兴趣。我想,如果我们谈论JavaScript客户机/jqueryajax,那么根据用户权限,使用一个函数从JSON中排除特定字段是可能的。我不知道是否有这样的功能。对于类型化C#客户机,不可能只使用服务代码将响应对象中的特定字段留空。但是用户现在会知道,这样的字段是存在的。我还没有使用过它,虽然我将来可能会使用,但您可能想看看它,直接使用或从中获得灵感。@Ben,ServiceStack不是一项服务,它是一个开源框架。谢谢marfarma的回答。你的例子和我选择的方法差不多。我还以递归方式添加了对象包含。我希望这不是servicestack有朝一日会修复的漏洞。关于这个问题,这里有另一个观点:供您考虑。
{"Test1":"7","Test2":"Value2"}
{"Test1":7,"Test2":"Value2"}