服务器端和客户端WCF共享验证库可以吗?
我在IIS服务器(因此是客户端)引用的应用程序服务器上使用WCF库。我想把我的验证放在一个地方,这样我就可以调用.Validate(),它返回一串错误(字段太短,缺失等)。问题是,这些函数不会跨越WCF边界,我真的不想在WCF服务和IIS/WCF客户端中编写相同的逻辑。有没有办法使用扩展方法或类似的东西,所以双方都可以使用调用相同代码的.Validat()方法?
非常感谢您的任何想法! Steve
如果控制线两侧,即服务器端(服务)和客户端,那么你可以做到以下几点:
- 把所有的服务和数据合同到共享装配
- 参考从服务器端和客户端
- 手动创建客户端代理(由
ClientBase<T>
获得或从ChannelFactory<T>
创造它)这两个“合同”集结号 - 不使用“添加服务引用”或SvcUtil工具。可执行程序! - 把所有的验证逻辑到一个共享组件
- 参考来自两个项目共享的验证组件
如果你想使用一个共享的验证组件,你必须确保你的服务器上使用的数据类型和客户端是相同的 - 这只有在您还共享服务和数据合同时才能完成。不幸的是,这需要手动创建客户端代理(这真的不是什么大问题!)。
如果您使用“添加服务引用”,Visual Studio将根据其元数据检查服务,并创建一组新的客户端对象,其中看起来在其字段和所有,但是它们是一个单独的,不同的类型,因此您将无法在服务器端和客户端对象上使用共享验证。
将数据发送到服务器进行验证是否存在问题?换句话说,你的服务接口实际上提供了“Validate”方法,并且接受一个充满数据的数据契约,验证它并返回一个List,其中T是某种定制的ValidationResult数据契约,它包含你需要的关于验证警告/错误。
在服务架构中,您不能相信客户端,理论上他们可能是其他公司的客户端为您完成了适当的数据验证。您始终需要在服务层进行设计,并将这些验证问题传达给您的客户。所以,如果你在服务器上完成这项工作,为什么不把这个逻辑开放给客户端,这样他们就可以直接使用它?当然客户可以(应该)仍然进行一些基本的输入验证,例如检查空值,空字符串,值超出范围等,但是核心业务逻辑检查应该发送到服务。
嗨德鲁,谢谢你的回应。我曾考虑类似的东西 - 我也赞赏验证服务器端的价值。然而,这背后的一点是想出一个更有创意的方式来限制通过WCF的数据量 - 因此,首先提供验证客户端,而不是让它们提交它只是失败。如果我公开了验证函数,那么每种类型的对象都需要一个,它仍然需要通过电线 - 所以理想情况下,我希望有一些方法可以共享验证代码,以便两者都可以使用它。 – MrCraze 2009-10-29 01:14:32
那么没有办法共享行为,除非你创建一个包含你的数据协议的程序集以及这些帮助器方法,并将其提供给你的客户。从纯粹的SOA角度来看,这不是“纯粹”的方式(如果它是另一方面的Java/PHP/Ruby,不会有所帮助,但是如果这是一个内部服务,并且您可以控制该组件客户使用与您的服务进行通信,那么您可以保证他们也会使用最新和最好的验证逻辑。 – 2009-10-29 01:44:07