Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Rest_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,.net,Rest,servicestack" /> servicestack,C#,.net,Rest,servicestack" />

C# 使用ServiceStack隐藏输出成员

C# 使用ServiceStack隐藏输出成员,c#,.net,rest,servicestack,C#,.net,Rest,servicestack,我正在评估ServiceStack作为我们希望在系统环境中使用的一种可能的REST服务,到目前为止,我对它非常满意。 服务的一个要求是隐藏特定用户或用户组的字段。根据用户拥有的密钥/会话 并非数据模型的所有字段都返回给客户机,它们必须由服务堆栈隐藏。因此,在收到数据对象(列表)后 从Linq2SQL中,我使用反射分析对象,提取对象成员,忽略应该隐藏的成员并添加其他成员 词典的成员。之后,我将字典传递给ServiceStack,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的服务中删除并执行
      • 将复杂结构脱水成
      利用不同的技术,其功能是围绕POCO构建的,提供了前所未有的重用级别,减少了摩擦,促进了一致性、更可用性和更易于理解的代码基础


      这个问题似乎离题了,因为它是对外部服务的支持请求,应该针对该服务。我不认为这个问题离题了。我对这个问题也很感兴趣。我想,如果我们谈论JavaScript客户机/jqueryajax,那么根据用户权限,使用一个函数从JSON中排除特定字段是可能的。我不知道是否有这样的功能。对于类型化C#客户机,不可能只使用服务代码将响应对象中的特定字段留空。但是用户现在会知道,这样的字段是存在的。我还没有使用过它,虽然我将来可能会使用,但您可能想看看它,直接使用或从中获得灵感。@Ben,ServiceStack不是一项服务,它是一个开源框架。谢谢marfarma的回答。你的例子和我选择的方法差不多。我还以递归方式添加了对象包含。我希望这不是servicestack有朝一日会修复的漏洞。关于这个问题,这里有另一个观点:供您考虑。
      {"Test1":"7","Test2":"Value2"}
      {"Test1":7,"Test2":"Value2"}