.Net WebService WSDL复杂类型是否要求属性具有Get / Set?

时间:2011-02-21 17:53:48

标签: c# web-services wsdl asmx complextype

我正在定义一个调用服务库的Web服务。服务库有一个名为customer的对象,其客户ID定义如下:

public class Customer
{
    private int _customerID;
    public int CustomerID
    {
        get { return _customerID; }
    }
}

当我尝试通过我的Web服务传递客户对象时,似乎生成的WSDL不包含属性CustomerID,除非我定义了一个setter。似乎在某些情况下要求制定者是不可取的。我是否遗漏了某些内容,或者生成WSDL是否要求属性具有getter / setter以便向客户端公开?

3 个答案:

答案 0 :(得分:3)

其他答案是正确的,但没有提到这是对XML序列化程序的限制,它由ASMX Web服务使用。

ASMX Web服务现在被Microsoft视为“遗留技术”,不应用于新服务开发。他们的替代品WCF没有这个限制。

答案 1 :(得分:0)

看看这是否有帮助:http://support.microsoft.com/kb/313584

看来这是一项要求,如果客户端尝试设置此属性,您可以执行的操作是抛出异常。

从我发布的链接

  

要解决此问题,请添加SET   财产程序。您可以   要么将程序留空,那么   该程序没有效果,   或者提出自定义异常以通知   该物业的客户   只读,如下:

Public Property Id() As Integer
    Get
        Return nID
    End Get
    Set(ByVal Value As Integer)
        Throw New Exception("Cannot set read-only property 'Id'")
    End Set
End Property

你的可能会成为:

public class Customer
{
    private int _customerID;
    public int CustomerID
    {
        get { return _customerID; }
        set { throw new exception("Cannot set value!"); }
    }

}

答案 2 :(得分:0)

setter是必需的,因此.Net可以在传输后设置属性(在反序列化期间)。您可以通过实现自己的对象或可能将其设置为内部对象来解决此问题:internal set { }

这实际上更多是安全性考虑因素,因此应该受到支持,但默认.Net行为是WSDL中属性的1-1映射。如果内部setter不起作用(我希望它不会)并且您不想打扰自定义ser / deser,那么只需向设置器添加throw new SecurityException()

您可以通过实现自己的custom serialization来绕过所需的setter,但我不确定WSDL的外观。我没有尝试过,但我怀疑自定义序列化和内部设置器的组合将解决问题。

编辑:正如@John Saunders所指出的,在WCF中可能没有setter限制。