使用 WCF 用戶端存取服務
建立服務之後,下一個步驟就是建立 WCF 用戶端。用戶端應用程式會使用 WCF 用戶端與服務進行通訊。用戶端應用程式通常會匯入服務的中繼資料,以產生可用來叫用服務的 WCF 用戶端程式碼。
建立 WCF 用戶端的基本步驟包含下列各項:
編譯服務程式碼。
使用 ServiceModel 中繼資料公用程式工具 (Svcutil.exe) 來建立 WCF 用戶端。
ServiceModel 中繼資料公用程式工具
ServiceModel 中繼資料公用程式工具 (Svcutil.exe) 是從中繼資料產生程式碼的命令列工具。下列用法是基本 Svcutil.exe 命令的範例。
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
或者,您也可以在檔案系統上,搭配 Web 服務描述語言 (WSDL) 和 XML 結構描述定義語言 (XSD) 檔案來使用 Svcutil.exe。
Svcutil.exe <list of WSDL and XSD files on file system>
如此會產生包含 WCF 用戶端程式碼的程式碼檔案,其中的用戶端程式碼可讓用戶端應用程式使用,藉此叫用服務。
您也可以使用工具來產生組態檔。
Svcutil.exe <file1 [,file2]>
如果僅提供一個檔案名稱,這就會是輸出檔的名稱。如果提供兩個檔案名稱,則第一個檔案為輸入組態檔,其內容會與產生的組態合併,並寫入至第二個檔案。如需詳細資訊組態的詳細資訊,請參閱設定 Windows Communication Foundation 服務的繫結。
注意: |
---|
未受保護的中繼資料要求和未受保護的網路要求一樣,都會構成某些風險:如果您無法確定正在進行通訊的端點是否為名符其實的端點,那麼您所擷取的資料很可能是來自於惡意服務的中繼資料。 |
範例
下列程式碼範例會顯示對服務建立的服務合約。
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
// Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
' Other methods are not shown here.
End Interface
ServiceModel 中繼資料公用程式工具會產生下列 WCF 用戶端類別。該類別是繼承自一般 ClientBase 類別,而且會實作 ICalculator
介面。這個工具也會產生 ICalculator
介面 (此處未顯示)。
public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
public CalculatorClient(){}
public CalculatorClient(string configurationName) :
base(configurationName)
{}
public CalculatorClient(System.ServiceModel.Binding binding) :
base(binding)
{}
public CalculatorClient(System.ServiceModel.EndpointAddress address,
System.ServiceModel.Binding binding) :
base(address, binding)
{}
public double Add(double n1, double n2)
{
return base.InnerChannel.Add(n1, n2);
}
}
Partial Public Class CalculatorClient
Inherits System.ServiceModel.ClientBase(Of ICalculator)
Implements ICalculator
Public Sub New()
MyBase.New
End Sub
Public Sub New(ByVal configurationName As String)
MyBase.New(configurationName)
End Sub
Public Sub New(ByVal binding As System.ServiceModel.Binding)
MyBase.New(binding)
End Sub
Public Sub New(ByVal address As _
System.ServiceModel.EndpointAddress, _
ByVal binding As System.ServiceModel.Binding)
MyBase.New(address, binding)
End Sub
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As _
Double Implements ICalculator.Add
Return MyBase.InnerChannel.Add(n1, n2)
End Function
End Class
使用 WCF 用戶端
若要使用 WCF 用戶端,請建立 WCF 用戶端的執行個體,然後呼叫其方法,如下列程式碼所示。
// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint"));
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")
' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)
對用戶端擲回的例外狀況進行偵錯
許多由 WCF 用戶端擲回的例外狀況是由服務上的例外狀況所造成。以下提供一些這類範例:
SocketException:現有的連接遭遠端主機強制關閉。
CommunicationException:基礎連接意外關閉。
CommunicationObjectAbortedException:通訊端連接中止。這種情況可能是處理訊息時發生錯誤、遠端主機超過接收逾時時間,或基礎網路資源問題所造成。
發生這類例外狀況時,最佳的解決方式是開啟服務端的追蹤功能,並且判斷該處發生哪種例外狀況。如需詳細資訊追蹤的詳細資訊,請參閱追蹤和使用追蹤來疑難排解應用程式。
另請參閱
工作
HOW TO:建立 Windows Communication Foundation 用戶端
HOW TO:使用雙工合約存取服務
HOW TO:以非同步方式呼叫 WCF 服務作業
HOW TO:使用單向和要求-回覆合約來存取 WCF 服務
HOW TO:使用 WCF 用戶端來存取 WSE 3.0 服務
HOW TO:使用 XmlSerializer 改善 WCF 用戶端應用程式的啟動時間