2011-12-10 32 views
0

我一起工作Model.dll使用在Windows應用程序和Web服務的同一類庫

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace root 
{ 
    public class Customer 
    { 
     private int _Id; 

     public int Id 
     { 
      get { return _Id; } 
      set { _Id = value; } 
     } 

     private string _Name; 

     public string Name 
     { 
      get { return _Name; } 
      set { _Name = value; } 
     } 
    } 
} 

ASP.NET Web服務參考Model.dll如此我可以在web方法使用:

[WebMethod] 
public string HelloWorld(root.Customer customer) { 
    return "Hello World"; 
} 

參考Model.dll和Web Service的Windows應用程序(1)。

root.Customer newCustomer = new Customer(); 
newCustomer.Id = 1; 
newCustomer.Name = "Name"; 

ws.Service ws = new root.ws.Service(); 
ws.HelloWorld(newCustomer); 
      ^problem here 

錯誤:參數 '1':無法從 'root.Customer' 轉換爲 'root.ws.Customer'


(1)右鍵 - >和Web參考 - >在此解決方案的Web服務 - >點擊Service.asmx - > 輸入Web引用名稱:WS - >單擊添加引用


更新:我可以從

public string HelloWorld(Customer customer) 

更改生成Reference.cs文件行

public string HelloWorld(root.Customer customer) 

所以功能會尋找真正的模型,而不是代理對象,但不是真正的答案。
我不想在每次Web參考更新後編輯此文件。
如何強制使用真實模型?

回答

1

恐怕在自動生成的ASMX代理中重複使用類型是不可能的。

有三種選擇。

1)編寫自己的代碼生成器,將採取行動,如wsdl.exe即構建Web服務的代理,但重用你指定的類型

(比較困難)

2)編寫自己的代碼重寫該將重寫自動生成的代理以使用您自己的類型。你會在每次調用這樣重寫你建立你的參考Web服務

(仍然繁瑣)

3)切換到WCF Web服務之後。 basicHttpBinding上的WCF服務在語義上等同於ASMX Web服務(使用基於http + soap的相同通信協議),但WCF服務元數據包含更多關於類型的信息,以便代理生成器能夠「從引用的程序集中重用類型」。

(建議的方法)

+0

+1。另請參閱[WCF手動方式...正確的方式](http://www.code-magazine.com/Article.aspx?QuickID=0809101)。 – TrueWill

0

如果從ASMX切換,並開始使用WCF的SVC模型,你可以共享服務器和客戶端之間的庫而不會引起大驚小怪的。如果這是一個選項,有很多資源可以幫助您在線WCF。

相關問題