【问题标题】:Creating instance of a service-side DataContract class on client-side in WCF在 WCF 的客户端创建服务端 DataContract 类的实例
【发布时间】:2010-03-23 09:17:22
【问题描述】:

我有我的自定义类 Customer 及其属性。我在类上方添加了 DataContract 标记,并将 DataMember 添加到属性,它工作正常,但我正在调用服务类的函数,将客户实例作为参数传递,我的一些属性得到 0 值。

调试时我可以看到我的属性值,在它到达函数之后,一些属性的值是 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 或什么都不传递,但是当我调用服务类的函数时,它返回该类的新实例,它工作正常。

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

【问题讨论】:

  • 您应该深入挖掘 vs 生成的客户端代理,看看它是否在其中并且与您的服务相同。因为这听起来很像合同不匹配。
  • 如果我在客户端或服务端创建服务类的实例,有什么区别吗?
  • 并非如此,但您应该确保双方的版本相同。您是自己制作代理还是让 vs 为您创建一个?
  • vs 生成代理,似乎当我将客户对象传递给另一个函数时,它工作正常。问题仅在于该功能。不同之处在于创建实例。我使用在服务器端生成并返回给客户端的客户对象,并且仅在调用该函数之前,我在客户端创建实例。我尝试在服务器端创建函数,创建实例并将其返回给客户端,它开始工作。有什么线索?

标签: wcf createinstance


【解决方案1】:

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

【讨论】:

  • 如果我将订单添加到我的某些类的属性中,wcf 不会自动为其他属性生成订单参数吗?我可以在reference.vb 中看到所有类参数的顺序参数。我不确定你的回答是否正确。
  • 这只是我的类和服务功能的一小部分。我的属性确实从 1 开始。感谢您提供的信息。这真的会导致这种问题,或者可能不仅仅是这样吗?为什么它会正确传递大部分参数而其他参数不会?
  • 我的reference.vb中的顺序与数据成员的顺序参数的顺序不匹配。
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多