我在VS2012中使用VB.net和.net framework 4.0
我有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 (数据为IData.DS。 CustomersDataTable ),一切都很好! 这个问题出现在我使用类型化数据表作为参数的每个方法中,代理总是使用CustomersDataTable。
但是当我从合同中返回它时,它会像GetOrders函数一样正确序列化。
如果我手动纠正代理类,它可以正常工作,但是当我更新服务引用时,我会丢失更改。
PS。如果我删除重用类型,每个函数返回一个对象xxxResponse(es GetOrdersResponse),我不知道如何使用它:S
答案 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”(您必须将其更改为您的服务界面)频道代理。