【发布时间】:2023-11-10 16:43:01
【问题描述】:
我仅将 WCF 用于数据服务(即应用程序内部并且非常精简,没有会话状态等),以保持我们的 Web 应用程序可扩展。
我们需要为当前一直传入的每个服务调用提供一些通用属性。每次调用都只有一个请求对象并不理想,因为除了这些常见属性之外,其余的都非常多样化,并且在开发过程中变化非常频繁。
目前我正在考虑使用自定义标头和 clientmessageinspector 来设置值。 对于这种情况,这是最简单的推荐方法还是有更好的方法?
更多细节..
下面的红点是我不确定正确方法(或如何去做)的地方。
发送的内容
发送的数据是一组简单的 id(3 或 4 个用于 userid、clientid 等) - 所有这些 id 都会影响安全性和性能(在某些情况下,它决定了要转到哪个数据库)。
我们还将对其进行扩展,使其拥有更复杂的权限 - Windows 工作人员不需要。
调用者可以是来自会话对象的 Web 应用程序,也可以是手动填充这些对象的 Windows 服务工作者。
当前的想法
理想情况下,调用者工作流上的 getinstance 将使用会话对象自动填充这些属性,或者使用 Windows 服务调用(不同的构造函数?)手动填充这些属性。
然后,我们将确保这些参数始终可用,无需任何思考,也无需在整个代码中不断引用,以在调用它的每个函数上构造合约。我们目前有很多服务调用(由于应用程序的规模/复杂性,而不是由于糟糕的工程:)),因此随着复杂权限的扩展,以自我记录的方式执行规则变得有点困难。
从概念上讲,会话是您在应用程序中处理此问题的地方,但服务实际上只是一个数据访问层(具有视图映射、分页和来自存储库调用的最后调用安全性),因此我们不需要它某种重复或复杂性,只是要包含在查询中的关键身份和权限字段。
问题
这感觉很像我们应该在调用的标头上做的事情,因为我们总是需要这些字段,但我有点不确定 set 和 get 应该位于端点和客户端接口的生命周期中的哪个位置.我也很高兴我错了。
【问题讨论】:
-
您似乎正在考虑的称为规范模型消息方案soapatterns.org/patterns/canonical_schema,是一种强大的方法。
-
嗨 Martin,这是下面@Slugster 建议的模式,但我们真的不希望每次调用都带有合约的抽象层。我们的大多数请求都需要简单的参数,因为我们的服务是内部的,我们不需要版本控制等。参数更加自我记录,除非执行复杂的搜索样式操作,在这种情况下我们使用合同。