2011-04-01 72 views
1

我已創建了WEBMETHODweb服務從WEBMETHOD參數刪除的命名空間問題

服務:

[WebMethod]  
    public void GetCommission(List <BOLibrary.Flight.DTContract>Loc) 
{ 
} 

在客戶端我傳遞的參數 客戶

List<BOLibrary.Flight.DTContract> BoList = new List<BOLibrary.Flight.DTContract>(); 
     BOLibrary.Flight.DTContract dtConboj = new BOLibrary.Flight.DTContract(); 
     dtConboj.ValidatingCarrier = "AA"; 
     BoList.Add(dtConboj); 
     BOLibrary.Flight.DTContract[] pass = BoList.ToArray(); 
     service.GetCommission(pass); 

但問題是,service.GetCommission(pas s)認爲servicenameSpace.DTContract 的論點,但在客戶端客戶端我有BOLibrary.Flight.DTContract

所以我怎麼能傳遞參數到服務。 Pleae看到錯誤消息Error i am getting while passing the parameter

回答

0

由webservice生成的客戶端代碼正在創建它自己的服務器端對象版本。

根據定義,webservice超出了應用程序的範圍並定義了一個接口對象,因此 - 客戶端域中的對象可能與服務定義的對象相同。

換個說法 - web服務定義了整個傳輸層,包括涉及的任何傳輸對象。您不能在此傳輸層中使用自己的對象(不管名稱空間),因爲服務器不知道它們 - 服務器只知道它定義的對象。

所以在這種情況下,如果你想與它通信,你必須從服務器的類型創建一個對象列表。

正如其他人所說,還有其他通信方法可以讓您在客戶端和服務器之間共享庫(即WCF),如果這是您想要做的。

0

我不知道爲什麼你的網頁類正在與XmlInclude修改的快照,SoapInclude & XmlRoot屬性,因爲我認爲他們只有當你打算XML/SOAP序列化應用網頁本身。

編譯錯誤說的是BOLibrary.Flight.DTContract類不是來自生成的WebReference代碼中的FPCommission.CommissionService命名空間。用於調用服務的所有客戶端對象都應來自FPCommission命名空間。如果您在客戶端和服務之間共享程序集,那麼您的代碼將無法工作。只需使用FPCommission.DTContract類而不是BOLibrary.Flight.DTContract類,並且您的代碼應該可以工作。

0

解決此問題的一種方法是實施EntityTranslator這是一種模式,它接受數據合同實體並將其「翻譯」爲業務實體。

它很簡單,真的。你所要做的就是創建兩個方法:一個接受數據合同實體並從中創建業務實體,另一個接收業務實體並創建數據合同實體。

的例子有額外的鏈接,可以發現here

1

這是預期的行爲。沒有辦法改變它。

如果您希望能夠在客戶端和服務上使用完全相同的類型,那麼您需要轉移到WCF。

0

我認爲AutoMapper應該可以做你想做的。

例如

using AutoMapper; 

// ... 

Mapper.CreateMap<BOLibrary.Flight.DTContract, FPCommission.DTContract>(); 
Mapper.Map<List<BOLibrary.Flight.DTContract>, FPCommission.DTContract[]>(BoList); 

請注意,您只需設置基本類類型之間的映射 - AutoMapper將負責處理集合之間的映射。

您應該嘗試將呼叫轉到Mapper.CreateMap()的某個地方,因爲如果頻繁呼叫該呼叫將會很昂貴,因此只能呼叫一次。

0

在你的代碼中,GetCommission方法需要一個List。 您的函數調用正在發送一個數組 - 不是列表?

1

我相信這是使用ASMX/WebMethod和Web引用時的預期行爲。也就是說,客戶端和服務器應該是互斥的代碼庫。

如果要在服務的兩端使用公用實體/庫代碼,可以使用SvcUtil/reference參數生成代理,該代理將與WCF一起使用並使用共享庫中的類定義。從Web引用(使用wsdl.exe生成 - 我認爲?)的move your client code到WCF服務引用(使用svcutil.exe生成)相當簡單。