【问题标题】:Parameters types mismatch in proxy generated class for WCF ServiceWCF 服务的代理生成类中的参数类型不匹配
【发布时间】:2014-10-07 12:01:00
【问题描述】:

我在 VS2012 中使用 VB.net 和 .net framework 4.0

我有 4 个项目:

  1. DataAccessTier(包含数据集定义)
  2. DataEntityTier(数据集的强类型表适配器)
  3. DataService(公开合同的 WCF 服务)
  4. 客户端(使用生成的代理类来消费服务)

我在服务中定义合同

Function SetCustomers(data As CustomersDataTable) As Integer Implements IService.SetCustomers
    Using a = New CustomersTableAdapter
        SetCustomers = a.Update(data)
    End Using
End Function


Function SetOrders(data As OrdersDataTable) As OrdersDataTable Implements Service.SetOrders
    Using a = New OrdersTableAdapter
        a.Update(data)

    End Using
    Return data
End Function


Public Function GetOrders() As OrdersDataTable Implements IService.GetOrders
    Return (New OrdersTableAdapter).GetData()
End Function

Datatables 和 Tableadapters 对象是指 DataEntityTier 程序集。所有 Data* 项目都有 IData 命名空间。

好的,然后我在客户端中添加对服务的引用,使用重用类型。生成代理类,结果如下:

   <System.ServiceModel.OperationContractAttribute(Action:="http://tempuri.org/IService/SetCustomers", ReplyAction:="http://tempuri.org/IService/SetCustomersResponse")>  _
    Function SetCustomers(ByVal data As IData.DS.CustomersDataTable) As Integer


   <System.ServiceModel.OperationContractAttribute(Action:="http://tempuri.org/IService/GetOrders", ReplyAction:="http://tempuri.org/IService/GetOrdersResponse")>  _
    Function GetOrders() As IData.DS.OrdersDataTable


    <System.ServiceModel.OperationContractAttribute(Action:="http://tempuri.org/IService/SetOrders", ReplyAction:="http://tempuri.org/IService/SetOrdersResponse")>  _
    Function SetOrders(ByVal data As IData.DS.CustomersDataTable) As IData.DS.OrdersDataTable

SetOrders(数据 As IData.DS.CustomersDataTable)一切正常! 这个问题存在于我使用类型化数据表作为参数的每种方法中,代理始终使用客户数据表。

但是当我从合同中返回它时,它会像在 GetOrders 函数中一样正确序列化。

如果我手动更正代理类,它可以正常工作,但是当我更新服务引用时,我会丢失更改。

PS。如果我删除重用类型,每个函数都会返回一个对象 xxxResponse(es GetOrdersResponse),但我不知道如何使用它:S

【问题讨论】:

    标签: vb.net wcf proxy datatables type-mismatch


    【解决方案1】:

    我没有解决问题,但我使用了“解决方法”。我创建了自己的代理(在单独的程序集中,因此可以在其他项目中重用)。更多的工作,但更干净和更薄的方式

    Public Class ServiceProxy
    Inherits ClientBase(Of IService)
    Implements IService
    
    Public Function SetCustomers(data As DS.CustomersDataTable) As DS.CustomersDataTable Implements IService.SetCustomers
        Return Channel.SetCustomers(data)
    End Function
    

    所有方法都一样。就是这样!

    编辑

    您可以使用 ChannelFactory 来创建服务代理,而不是继承 ClientBase

    New ChannelFactory(Of IService)(endpointConfigurationName).CreateChannel()
    

    这为您提供了一个“IService”(您必须将其更改为您的服务接口)通道代理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多