2015-01-11 90 views
1

請問有人請問向我解釋請求和響應模型如何在WCF中工作?我有一個簡單的服務,公開一個名爲getRateOfExchange的方法,其中包含一個返回rateOfExchange []的整數參數,但從服務生成的Reference.cs文件包含許多類:WCF的困境:請求和響應類

getRateOfExchange(似乎是參數)

getRateOfExchangeRequest

getRateOfExchangeResponse

我嘗試了這些類及其方法的每個排列但沒有任何工程。直觀上你會希望創建一個以參數對象作爲參數的請求對象,然後將這個請求傳遞給執行請求的響應方法給服務器。

但是沒有。

它必須是痛苦的。

有人能解釋一下嗎?

UPDATE

謝謝梁詠琪,但我的課並不像說。

如果我按照你的模型,我的要求是這樣的:

CharterServices.charterServiceClient proxy = new CharterServices.charterServiceClient(); 

using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel)); 
{ 
    using (proxy as IDisposable) 
    { 
     var response = proxy.getRateOfExchange() 
    } 
}      

但是,我getRateOfExchange()方法需要一個getRateOfExchange對象,所以上面的代碼不compile.The getRateOfExchange類包含參數這是proxy.getRateOfExchange()方法的參數。我曾嘗試創建這個類的一個實例並將其傳遞上述方法,像這樣:

using (proxy as IDisposable) 
{ 
    var rateOfExchange = new Service.getRateOfExchange() 
    { 
     charterEnquiryId = 1550003668 
    }; 

    using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel)); 
    { 
     using (proxy as IDisposable) 
     { 
      var response = proxy.getRateOfExchange(rateOfExchange); 

      foreach (var rateOfExcchange in response) 
      { 
       Debug.WriteLine(rateOfExcchange.fromCurrencyName); 
      } 
     } 
    }      
} 

但試圖調用getRateOfExchange()時,它掛起。

Aaargh!我知道該服務正在工作,因爲我可以在SoapUI中執行相同的WSDL請求。

你能幫忙嗎?

+0

我不確定你的意思是「掛起」,但如果你傳遞一個對象作爲參數,那麼它需要一個DataContract。在創建新的WCF應用程序時,代碼中有一個示例,或者請參閱此處:http://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx – Gigi

+0

與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」,或在[所有]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be - 從我的帖子中刪除) –

回答

1

它實際上並不痛苦。一旦生成代理/客戶端類,您只需創建客戶端實例,然後像調用本地方法一樣調用方法。

我不能在這裏解釋整個過程,但是我會轉介你去看我一年前寫的intro,這個例子用一個簡單的例子來解釋整個過程。

即使在您編寫自己的客戶端之前,您也可以使用WCF測試客戶端來測試該服務。如果使用服務引用,編寫客戶端非常簡單。

下面是從博客文章,說明如何使用客戶端代碼,改爲具有using塊並使用簡潔的var關鍵字代碼的摘錄:

static void Main(string[] args) 
    { 
     using (var service = new ServiceReference1.Service1Client()) 
     { 
      var response = service.GetData(5); 
      Console.WriteLine(response); 

      Console.ReadLine(); 
     } 
    } 
+0

感謝Gigi,請參閱我上面的更新 – serlingpa

+1

在WCF代理中使用'using'被認爲是不好的做法:[避免使用語句的問題](http://msdn.microsoft.com /en-us/library/aa355056%28v=vs.110%29.aspx) – Tim

+0

我使用了類似的代碼來從我的服務中獲得匯率,但正如我所說的,它在調用服務時會掛起。我的意思是掛起進入服務代碼運行,永遠不會返回。什麼是我可以做的錯誤? – serlingpa

-1

假設rateOfExchangeintegers一個List,我剛剛添加了10個數字,從1到10.

然後,此列表作爲參數發送到服務客戶端對象的getRateOfExchange方法。

List<int> rateOfExchange=new List<int>(); 
for(int i=0;i<10;i++) 
{ 
rateOfExchange.Add(i); 
} 

//Service Call 
ServiceClient obj=new ServiceClient(); 
var response=obj.getRateOfExchange(rateOfExchange); 
foreach(var item in response) 
{ 
Console.WriteLine(item); 
} 
Console.ReadLine(); 

希望它有幫助。

+0

我用類似的代碼來獲得交換來自我的服務的費率,但正如我所說的,它在撥打服務時會掛起,我的意思是韓ging正在進入服務代碼運行並且從不返回。我到底能做什麼錯? – serlingpa

+0

嘗試再次重新生成代理。也許你的參數rateOfExchange太大或太長。或者服務中存在一些錯誤。您是否使用WCF測試客戶端單獨測試了服務? – Anurag

0

系統拋出一個沒有被捕獲的異常,所以組件模型決定掛起!現在修復它。