WCF 支援 REST 風格服務,搭配非同步呼叫可避免用戶端阻塞。本文以完整解決方案結構示範:契約專案、服務實作、自我裝載宿主、WinForm 非同步客戶端。
[DataContract] 實體 Person 與 [ServiceContract] 介面 IService。GetPerson,以 Thread.Sleep(5000) 模擬長時間運算。webHttpBinding + webHttp 行為啟用 REST。WebClient.DownloadStringAsync 非同步呼叫。<endpoint address="" binding="webHttpBinding"
contract="AsyCallRestfulWcf.Contracts.IService"
behaviorConfiguration="RestfulBehavior" />
<behavior name="RestfulBehavior">
<webHttp />
</behavior>
服務方法以 [WebInvoke(Method = "*", UriTemplate = "GetPerson?id={id}")] 對應 HTTP GET。
private WebClient wc = new WebClient();
private void btnStart_Click(object sender, EventArgs e)
{
wc.DownloadStringAsync(new Uri("https://localhost:8001/GetPerson?id=1"));
wc.DownloadStringCompleted += Wc_DownloadStringCompleted;
btnStart.Enabled = false;
btnCancel.Enabled = true;
}
private void Wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (!e.Cancelled && e.Error == null)
txtResult.Text = e.Result; // JSON 字串
btnStart.Enabled = true;
btnCancel.Enabled = false;
}
private void btnCancel_Click(object sender, EventArgs e)
{
wc.CancelAsync();
txtResult.Text = "請求已取消";
}
.NET Core / .NET 5+ 專案建議改用 HttpClient 搭配 await httpClient.GetStringAsync(uri),配合 CancellationToken 處理取消,程式碼更簡潔且支援跨平台。