【问题标题】:Hiding output members with ServiceStack使用 ServiceStack 隐藏输出成员
【发布时间】:2013-10-01 07:05:01
【问题描述】:

我正在评估 ServiceStack 作为我们想在我们的系统环境中使用的可能的 REST 服务,到目前为止我对它非常满意。 对服务的要求是隐藏特定用户或用户组的字段。取决于用户拥有的密钥/会话 并非数据模型的所有字段都返回给客户端,它们必须被服务堆栈隐藏。因此在接收到数据对象(列表)之后 从Linq2SQL我用反射分析对象,提取对象成员,忽略应该隐藏的成员并添加其他 成员到字典。之后我将字典传递给 ServiceStack,ServiceStack 将其序列化并将数据结构发送给客户端。

我对此设置的问题是:

  • 这是使用 ServiceStack 的正确方法还是我在滥用 即将修复的漏洞?
  • 是否有 ServiceStack 方法来实现相同的目标?
  • 您有什么可以推荐的最佳做法吗?

【问题讨论】:

  • 这个问题似乎离题了,因为它是对外部服务的支持请求,应该针对该服务。
  • 我不认为这个问题是题外话。
  • 我对这个问题也很感兴趣。我想,如果我们谈论 JavaScript 客户端 / jQuery Ajax ,那么根据用户权限使用一个函数从 JSON 中排除特定字段是可能的。不知道有没有这样的功能。对于类型化的 C# 客户端,这是不可能的,只有服务代码将响应对象中的特定字段留空。但是用户现在会知道这样的字段存在。
  • 我没用过,虽然我以后可能会用,但你可能想看看github.com/AnthonyCarl/ServiceStack.PartialResponse 直接使用或获得灵感。
  • @Ben,ServiceStack 不是服务,它是一个开源框架。

标签: c# .net rest servicestack


【解决方案1】:

使用 ServiceStack 的正确方法是为您的 API 定义 DTO,而不是尝试使用现有的业务对象。如果您的客户准备解析返回具有字典属性的 DTO 的列表,则可以工作。

实现它的一种“ServiceStack”方法是定义一个简单、扁平的 DTO,其中包含所有可能的属性,其中每个属性都是可空的。

给定 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());

产生:

{"Test1":"7","Test2":"Value2"}
{"Test1":7,"Test2":"Value2"}

在默认设置中使用 ServiceStack.Text 作为 JSON 库来序列化空值。

关于最佳实践,请参阅 https://github.com/ServiceStack/ServiceStack/wiki/Advantages-of-message-based-web-services,其中讨论了 ServiceStack 理念。特别推荐使用:

代码优先的 POCO

由于它提倡干净、可重用的代码,ServiceStack 一直鼓励在几乎所有事情上使用代码优先的 POCO。即可以使用相同的 POCO:

  • 在请求和响应 DTO 中(在客户端和服务器上)
  • 在 JSON、JSV 和 CSV 文本序列化程序中
  • 作为 OrmLite、db4o 和 NHibernate 中的数据模型
  • 作为存储在 Redis 中的实体
  • 作为存储在缓存和会话中的 blob
  • 在 MQ 的服务中删除并执行
  • 将复杂的配置脱水成

利用围绕 POCO 构建功能的不同技术提供前所未有的重用水平、减少摩擦、促进一致、更可用和更容易解释代码库。

【讨论】:

  • 感谢马尔法玛的回答。您的示例与我选择的方法或多或少相同。我还以递归方式添加了对象包含。我希望这不是 servicestack 有一天会修复的漏洞
  • 这是对这个问题的另一种看法:stackoverflow.com/a/18993146/149060 供您考虑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多