首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 入門指南:核心概念、託管與客戶端開發全解析

     編輯:關於.NET

Windows Communication Foundation (WCF) 是微軟實現的一套服務導向架構 (SOA) 標準,旨在解決傳統三層架構中客戶端與業務邏輯層緊密耦合的問題。透過服務契約、數據契約、錯誤契約與訊息契約,WCF 讓分散式應用的開發變得更加靈活且標準化。

核心三要素:地址、綁定、契約

端點地址

每個 WCF 服務必須擁有唯一的端點地址,格式為 [傳輸協定]://[服務位置]。WCF 支援多種傳輸協定,包含 HTTP、TCP、對等網路、命名管道 (Named Pipes) 以及 MSMQ。例如 net.tcp://localhost:8800/Henllyee.Service 即代表透過 TCP 協定在本機 8800 連接埠存取該服務。

契約定義

契約是服務與客戶端溝通的介面規範,主要分為四類:

  • 服務契約:定義可被呼叫的操作,使用 [ServiceContract] 標記介面或類別,[OperationContract] 標記方法。
  • 數據契約:定義傳遞的資料結構,使用 [DataContract] 與 [DataMember]。
  • 錯誤契約:定義 SOAP 錯誤資訊,使用 [FaultContract]。
  • 訊息契約:直接控制 SOAP 訊息結構,使用 [MessageContract]。

程式碼範例:定義服務契約與實作

namespace HenllyeeWCF.Service {
    [ServiceContract(Namespace = "https://henllyee.cnblogs.com")]
    public interface IHello {
        [OperationContract]
        string SayHello(string strName);
    }

    public class Hello : IHello {
        public string SayHello(string strName) {
            return String.Format("{0} say hello at {1}", strName, DateTime.Now.ToString());
        }
    }
}

服務託管模式

WCF 服務必須在進程中託管,常見三種方式:

  1. IIS 託管:自動啟動、支援 HTTP,適合 Web 環境。
  2. 自我託管:在 Console、WinForms、Windows Service 中手動控制生命週期,支援所有協定。
  3. WAS (Windows Process Activation Service):Vista/Server 2008 以上支援,非 HTTP 協定也能自動啟動。

自我託管範例

namespace HenllyeeWCF.Host {
    class Program {
        static void Main(string[] args) {
            using (ServiceHost host = new ServiceHost(typeof(HenllyeeWCF.Service.Hello))) {
                host.AddServiceEndpoint(
                    typeof(HenllyeeWCF.Service.IHello),
                    new NetTcpBinding(),
                    "net.tcp://localhost:8000/Hello");
                host.Open();
                Console.Read();
            }
        }
    }
}

客戶端開發

客戶端可透過「加入服務參考」產生 Proxy,或手動使用 ChannelFactory<T> 建立通道:

namespace HenllyeeWCF.Client {
    [ServiceContract(Namespace = "https://henllyee.cnblogs.com")]
    public interface IHello {
        [OperationContract] string SayHello(string strName);
    }

    class Program {
        static void Main(string[] args) {
            IHello proxy = ChannelFactory<IHello>.CreateChannel(
                new NetTcpBinding(),
                new EndpointAddress("net.tcp://localhost:8000/Hello"));
            Console.WriteLine(proxy.SayHello("Henllyee Cui"));
            Console.Read();
        }
    }
}

解決方案架構圖

執行結果圖

掌握 ABC(Address、Binding、Contract)與託管方式,即可快速建立跨平台、高互通性的分散式服務應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved