WCF服务的代理生成类中的参数类型不匹配

时间:2014-10-07 12:01:00

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

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

我有4个项目:

  1. DataAccessTier(包含数据集定义)
  2. DataEntityTier(数据集的强类型tableadapters)
  3. DataService(公开合同的WCF服务)
  4. 客户端(使用生成的代理类来使用服务)
  5. 我在服务中定义合约

    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 (数据为IData.DS。 CustomersDataTable ),一切都很好! 这个问题出现在我使用类型化数据表作为参数的每个方法中,代理总是使用CustomersDataTable。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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”(您必须将其更改为您的服务界面)频道代理。