我只使用WCF进行数据服务(即应用程序内部,非常精简,没有会话状态等),以保持我们的Web应用程序的可扩展性。
我们需要为我们当前正在传递的每个服务调用提供一些公共属性。每次调用都有单个请求对象并不理想,超出这些常见属性,其余的变化很大,并且在开发过程中经常发生变化。
目前我正在考虑使用自定义标头和clientmessageinspector来设置值。 对于这种情况,这是最简单的推荐方法还是有更好的方法?
更多细节..
下面的红点是我不确定正确的方法(或如何去做)。
发送了什么
正在发送的数据是一组简单的ID(对于userid,clientid等为3或4) - 所有这些ID都会对安全性和性能产生影响(在某些情况下,它会决定要转到哪个数据库)。
我们还将扩展此权限以获得更复杂的权限 - Windows工作者不需要。
调用者将是一个Web应用程序,它们来自会话对象,或者是一个Windows服务工作者,它们是手动填充的。
当前的思考
理想情况下,调用者工作流的getinstance会自动使用会话对象填充这些属性,还是使用windows服务调用手动填充更多属性(不同的构造函数?)。
然后,我们将确保这些参数始终可用,无需任何考虑或在整个代码中没有常量引用,以便在调用它的每个函数上构造契约。我们目前有很多服务调用(由于应用程序的规模/复杂性,而不是由于糟糕的工程:)),因此这扩展到复杂的权限,以自我文档的方式强制执行规则变得有点困难。 / p>
从概念上讲,会话是你在应用程序中处理这个问题的地方,但服务实际上只是一个数据访问层(具有视图映射,页面调度和来自存储库调用的最后调用安全性)所以我们不需要一种重复或复杂,只是关键的身份和要包含在查询中的权限字段。
问题
这感觉非常像我们应该对调用的标题进行操作,因为我们总是需要这些字段,但我不确定set和get应该位于端点和客户端接口的生命周期中的哪个位置。我也很高兴错了。
答案 0 :(得分:3)
根据我使用消息的经验,初始设置和配置可能非常棘手,在我的研究中,没有任何网站覆盖所有内容,我不得不从几个不同的地方选择片段并将它们拼凑在一起。
您需要质疑标题中的内容。是否需要为被调用的方法提供信息?如果是这样,那么将它放在标题中是错误的选项,因为每个方法都需要解析信息。
适用于此的信息类型是与WCF调用相关的自定义身份验证和/或用户特定元数据。在我的情况下,我有一个由自动服务启动的WCF调用,该服务被转发到更多的WCF端点,这是使用消息检查器的理想方案,因为我能够在中继点向头部添加元数据以供后续使用终点。
如果您只是想要打包每个调用所共有的一些数据,那么我将包括创建一个具有适当属性的基础数据对象,然后只为更专业的调用扩展它(终点可以确保公共数据要么存在,要么假设某些默认值(如果不存在)。对于每个端点使用消息检查器所需的公共数据是过度的,可能不可行。
答案 1 :(得分:1)
我应用了类似的架构;基本上每个客户呼叫需要携带一些关于选择哪个DB的信息,标识符等。在服务器端,这些参数应自动处理并存储在字典中。
我创建了一个通用代理类来包装客户端代理,以便为每个服务调用添加相关的标头。每个需要调用服务的开发人员都会在调用中使用此通用代理类。
在服务方面,我已经实现了DispatchMessageInspector
作为端点行为,其中数据从请求标头中提取并存储在字典中。字典在OperationContext(IExtension<OperationContext>
)的扩展内初始化,并在请求处理期间可用。
请注意,服务的实例上下文模式为PerCall
。