是否可以在SOAP Web服务中创建只读元素?

时间:2009-05-27 13:24:35

标签: c# web-services soap c#-2.0

我有一个定义了只读属性的类。在我的代码中,我将其定义为仅具有getter的属性。

我希望能够在Web服务中来回发送此对象。当我在服务中调用“Get”方法时,它将在服务端填充一个值。定义此属性后,我不希望Web服务的使用者能够设置/更改此属性。

当我向项目添加对此Web服务的引用时,该对象具有序列化的属性,具体取决于我尝试在服务端定义对象的方式:

  • 内部setter :在WSDL中创建属性。 Visual Studio生成一个同时具有getter和amp;这个属性的二传手。
  • no setter :不在WSDL中创建属性。 Visual Studio显然根本没有定义这个属性。
  • 只读公共成员变量 - 不在WSDL中创建属性。同样,Visual Studio不会对此属性执行任何操作,因为它不知道它。

允许Web服务的使用者为此属性设置值不会造成任何伤害。如果设置了该值,则在Web服务端忽略该值。如果消费者无法更改/设置属性,我只是更喜欢。

有没有办法将属性定义为只读?现在我们正在使用C#/。NET 2.0作为Web服务,并且(至少现在)我们可以控制这项服务的所有使用者,所以我可以尝试在需要时更改配置,但我更愿意只改变Web服务上的东西,而不是消费者。

3 个答案:

答案 0 :(得分:3)

我可能错了,但我认为这里的问题是序列化是如何工作的 - 为了反序列化一个对象,序列化器创建一个空对象,然后设置这个对象的所有属性 - 这就是为什么你需要一个setter的属性被包括在序列化中。客户端代码与反序列化器具有相同的“接口”。

答案 1 :(得分:1)

警告,我是一名Java人员,因此我的答案的第一部分重点关注C#中可能出现的问题。

首先,使用Java中的自定义序列化程序,您几乎可以执行任何操作,包括使用反射直接设置受保护字段或私有字段的值,只要安全管理器不阻止此活动即可。我不知道C#中是否有类似的组件用于安全管理器,字段访问和自定义序列化程序,但我怀疑它有。

其次,我认为在您的应用程序中查看Web服务和Web服务接口的方式存在根本区别。您右键单击从现有代码生成Web服务接口 - 称为“代码优先”。关于为什么WSDL首先是首选方法的文章很多。 This一个人很好地总结了一些事情,但我也建议你阅读其他内容。当您考虑Web服务的客户端和服务器端之间的共享代码库以及维护对象结构和可访问性时,一旦将API作为Web服务发布并且无法控制,就没有这样的保证。所有的消费者。 WSDL和XSD充当Web服务API的一般描述,您的服务器和客户端可以使用不同的数据绑定配置,对象类或语言来实现。您应该将Web服务接口和传入和传出的XML视为描述交换的语义,但在客户端内部化(反序列化)后,不一定要考虑数据的语法(您的类结构)。或服务器。

此外,建议将与传输相关的结构与内部业务逻辑结构分离,以免发现自己必须同时重构服务器实现,Web服务API和(和其他)客户端实现。

答案 2 :(得分:0)

据我所知,在.NET 2.0中没有内置的方法可以做到这一点。如果我想序列化只读属性,我已经实现了IXmlSerializable接口,以便我可以控制ReadXml()WriteXml()方法。

在.NET框架的更高版本中,您可以通过在支持字段上设置属性来序列化只读属性。