2011-12-07 17 views
2

我已經查看過SO和其他地方,並且看到了有關此問題以及一些仍然對我沒有意義的答案案件。帶有4個輸入參數和3個參數的WCF服務通過代理類項目中的添加服務參考進行重新排序

我重構我的工作VStudio 2010解決方案,它具有:

  • 一個項目,一個ASMX web服務
  • 的代理類另一個單獨的項目(這裏沒有代碼,除了由產生什麼添加Web附圖
  • 爲客戶端(另一個獨立的項目包含對 ProxyClass.dll
基準0

新VStudio 2010解決方案有:

  • 一個單獨的合同類型WCF服務庫的項目(IFileService.cs)對合同的執行 一個項目類型WCF服務庫(FileService.cs
  • 的代理類另一個單獨的項目(這裏沒有代碼,除了由產生什麼添加服務引用
  • 客戶端的另一個單獨的項目(包含對WCFProx參考yClass.dll)

這裏是一個與3個out參數(和它們的執行結束合同是一樣的順序):

[ServiceContract(Name = "IFileService", Namespace = "http://www.cbmiweb.com/TrimWCF/2011/11")] 
public interface IFileService 
{ 
    [OperationContract] 
     public string DownloadFile(string trimURL 
     , string TrimRecordNumber 
     , string CallerPC 
     , string RequestorID 
     , out byte[] docContents 
     , out string returnFiletype 
     , out string returnFilename) 
    { 

這裏是添加服務引用在我的代理類生成項目:

public string DownloadFile(
    out byte[] docContents 
, out string returnFiletype 
, out string returnFilename 
, string trimURL 
, string TrimRecordNumber 
, string CallerPC 
, string RequestorID) 
{ 
    return base.Channel.DownloadFile(out docContents, out returnFiletype, out returnFilename, trimURL, TrimRecordNumber, CallerPC, RequestorID); 
} 

我已閱讀答案範圍從「在WCF不能使用了PARMS」到「你不應該使用添加服務引用而是使用svcutil.exe的」到「參數的順序並不重要...它會 仍然有效「。

我很困惑在這裏做什麼(以及我做錯了什麼導致了這個重新安排的順序,爲什麼會發生這種情況)。

+0

當您使用參考調用服務時它會做什麼? – Maess

回答

2

首先,你沒有做錯什麼:)。即使客戶端和服務器中的方法中的簽名不同,它們也會與它們生成/使用的消息等效。您可以毫無問題地使用該代理類,並且它也應該可以正常工作。

爲什麼發生這種情況是另一回事 - 在服務描述(WSDL)中,每個(非單向)操作都有兩個「消息」:一個輸入參數,一個輸出參數。消息分別包含操作的輸入和輸出,但WSDL中沒有顯示它們的順序。因此,當諸如Add Service Reference或svcutil這樣的工具生成客戶端代理時,它將簡單地「選擇」一個訂單(首先輸出參數),但代理將發送到該服務的請求將與服務器期望的(並且,代理服務器的響應將被正確理解)。

如果你想維護參數的順序,你可以自己創建代理類。爲此,您可以使用ChannelFactory<T>類,也可以創建自己的從ChannelBase<T>派生的客戶類。但是你不需要那樣做,就像我之前提到的那樣。

+1

謝謝。我將繼續使用WCF將我的ASMX webservice重寫成相同的東西。 –