2010-03-23 105 views
0

我有我的自定义类Customer以及它的属性。我在类和DataMember之上添加了DataContract标记到属性,并且它工作正常,但我调用了一个服务类的函数,传递了客户实例作为参数,并且我的一些属性获得了0个值。在WCF客户端创建服务端DataContract类的实例

在调试时,我可以看到我的属性值,并在它到达函数后,一些属性的值为0.为什么它可以是这样?

这两个操作之间没有代码。 DataContract标记正常工作,一切正常。对此问题有何建议?

我试图将ByRef更改为ByVal,但它不会改变任何内容。为什么它会通过其他值正确的和一些整数类型只是0?

也许答案很简单,但我无法弄清楚。

谢谢。

<DataContract()> 
    Public Class Customer 
    Private Type_of_clientField As Integer = -1 

     <DataMember(Order:=1)> 
     Public Property type_of_client() As Integer 
     Get 
      Return Type_of_clientField 
     End Get 
     Set(ByVal value As Integer) 
      Type_of_clientField = value 
     End Set 
     End Property 
    End Class 

    <ServiceContract(SessionMode:=SessionMode.Allowed)> 
    <DataContractFormat()> 
    Public Interface CustomerService 

    <OperationContract()> 
    Function addCustomer(ByRef customer As Customer) As Long 

    End Interface 

在调用addCustomer函数之前,type_of_client属性值为6。进入该功能后,数值为0.

更新:问题出在实例创建。

当我在客户端创建一个类的实例,存储在服务端时,我的一些属性传递0或什么也没有,但是当我调用一个服务类的函数时,返回一个新的实例类,它工作正常。

有什么区别?这可能是序列化问题吗?

+0

您应该仔细查看vs生成的客户端代理,以查看它是否位于该服务器中,并且与您的服务相同。因为这听起来很像合同不匹配。 – albertjan 2010-03-23 10:45:13

+0

如果我在客户端或服务端创建服务类的实例,是否有区别? – hgulyan 2010-03-23 12:46:00

+0

不是真的,但你应该确保你在双方都有相同的版本。你有自己的代理吗,还是让你为你创建一个代理? – albertjan 2010-03-23 13:14:49

回答

1

如果您使用的是数据库的order参数,则必须从0开始并递增(即将1变为0,下一个数据库成为1等)。如果您有多个成员,这可能会有效,但无处可放,因为您展示的课程没有1个位置。

+0

如果我将一些命令添加到我的类的某些属性中,将不会自动向其他属性生成命令参数?我可以在reference.vb中看到所有类参数的order参数。 我不确定,如果我的答案正确。 – hgulyan 2010-03-26 07:53:03

+0

这只是我的班级和服务功能的一小部分。我的属性确实从1开始。谢谢你的信息。 难道真的会造成这种问题,或者不仅仅是这样?为什么它会通过大部分参数,而其他参数不是? – hgulyan 2010-03-26 08:00:50

+0

我的reference.vb中的订单与数据成员订单参数的顺序不匹配。 – hgulyan 2010-03-26 08:17:19