2014-10-07 39 views
0

我用VB.net在VS2012與.NET框架4.0參數類型的代理生成的類不匹配WCF服務

我有4個項目:

  1. DataAccessTier(包含數據集定義)
  2. DataEntityTier(用於數據集強類型的TableAdapter)
  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 

數據表和對象的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

我沒有解決問題,但我使用了「解決方法」。我創建了自己的代理(在一個單獨的程序集中,因此可以在其他項目中重用)。多一點工作,但一種更乾淨和薄的方式

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」(您必須將其更改爲您服務接口)通道代理。