2016-02-27 55 views
0

我之前使用過Web服務並理解了這個概念。但是現在我已經建立了一個WCF Web服務,但是我對它的使用有個疑問。 (在本教程中如何設置)使用WCF Webservice引用

我有以下幾點設置:

  • WCF服務庫(稱爲CalculatorService的)
  • 服務主機(稱爲CalculatorServiceHost)
  • 服務代理(叫CalculatorServiceProxy,使用ClientBase)
  • 服務客戶端(稱爲CalculatorServiceClient)

我的理解如下;

  1. 服務庫包含可以在web服務中使用的服務/對象。讓我們說這是一個加法的計算器。
  2. 主機使該類具有可用於客戶端的功能。
  3. 代理髮送和接收來自客戶端的消息到配置的端點。
  4. 客戶端可以通過代理從服務調用函數。

的教程建立代理如下:

public class MyCalculatorServiceProxy : ClientBase<ICalculator>, ICalculator { 
    public int Add(int num1, int num2){ 
     return base.Channel.Add(num1, num2); 
    } 
} 

這意味着,在代理我至少引用其包含ICalculator組裝。如果客戶缺少對同一個程序集的引用,則客戶也抱怨沒有提及該接口。

在本教程中,繼承接口的接口和類/服務位於同一個程序集中。因此,在客戶端引用程序集的接口意味着你也可以創建'Calculator'類的實例,甚至不需要WCF服務來調用函數。

這是否意味着您始終需要兩個帶WCF服務的程序集。一個具有接口,另一個具有類/服務?

糾正我,如果我錯了,或者如果有人有一些額外的信息/評論。

+0

是的,基本上你應該總是分開合同和運作的東西。合同是界面,請求和響應 –

+0

不,您可以在同一個程序集中擁有服務合同和服務實現。有時將它們分開很有用 - 例如,在工作中,我們在單獨的程序集中有服務合同(接口)。這允許客戶端引用程序集並使用ChannelFactory '爲客戶端生成代理。但是把它們放在一個裝配中是完全合理的。 – Tim

+0

您不需要參考計算器程序集,就可以使用wsdl生成代理。或者,如果wcf服務公開了元數據,您可以添加Web引用,它將創建代理。但我建議將合同和poco類分離到自己的程序集中,以便在客戶端和服務器中引用它們。 –

回答

0

@Tim但我想知道的是,如果你引用一個程序集與 服務合同和實施。爲什麼通過代理使用通過 web服務的服務。如果你可以通過其他程序集的引用立即調用函數 ?

如果你這樣做,而不是有一個服務與你的數據庫進行通信(例如),你已經有了該服務的每一個可能的客戶端,而不是你的數據庫。你到處都會有連接字符串。如果您需要修改服務代碼,則必須將更新部署到更多應用程序。您失去安全性,可伸縮性和可維護性。

但這對編寫單元和集成測試非常有用。

+0

這不是我的評論是關於。我的評論是關於私人代碼,並不想與客戶分享。這可以通過web服務完成。但我的問題是,如果你必須引用它,並且可以立即調用它,你爲什麼要這麼做。然而JanneMatikainen給出了很好的答案/建議。 – Sliver2009