Service-Oriented Architecture,面向服務架構,粗粒度、開放式、鬆耦合的服務結構,將應用程序的不一樣功能單元(稱爲服務)經過這些服務之間定義良好的接口和契約聯繫起來。接口採用中立的方式定義,獨立於實現服務的硬件平臺、操做系統和編程語言(跨平臺)。html
SOA既是一種編程方式,也是軟件開發的一種架構方法,服務層是SOA的基礎,核心是「服務」,本質就是將服務組合起來並對外提供接口。SOA架構的技術基礎是SOAP(Simple Object Access Protocol,簡易對象訪問協議)標準,SOAP用XML語言定義一個服務操做方法所發送和接收消息的內容。java
實現SOA思想的技術web
有關 web service 的學習,參見:Web Service - sqh;編程
關於 Web Service 和 WCF,異同點做簡單的說明json
關於WCF與Web Service的區別參見:http://www.cnblogs.com/xiurui12345/archive/2012/03/30/2425445.html。下面主要研究 WCF。
windows
Windows Communication Foundation(WCF)是由微軟開發的一系列支持彈性數據通訊的應用程序框架,Windows通信開發平臺。支持和集成Web Service,兼容和具有微軟早期技術的特性,整合了原有windows通信的 .Net Remoting、WebService、Socket機制,融合有HTTP和FTP相關技術,是創建在Web Service架構上的一個全新通訊平臺。api
WCF能夠理解爲Web Service的升級版。瀏覽器
微軟官方解釋:WCF是徹底使用託管代碼創建和運行面向服務應用程序的統一框架,使開發者能創建一個跨平臺的安全、可信賴、事務性的解決方案,且能與已有系統兼容協做安全
WCF是一套框架,用來建立各類服務,且可以建立兼容Web服務的服務,也就是說能夠建立可以與Web服務互聯互通的服務。WCF最基本的通訊機制是SOAP,保證系統之間的互操做性。WCF技術容許建立服務,能夠跨進程、計算機和網絡從其餘應用程序訪問這些服務。利用這些服務,能夠在多個應用程序中共享功能,提供數據源或抽象複雜過程。
優勢
其他相關信息可參考:WCF .vs. Web Service
WCF作啥
WCF 是面向服務的,跨平臺的安全、可信賴、事務性的解決方案,做爲 WebService,.Net Remoting,Enterprise Service,WSE,MSMQ 的並集,以面向服務爲思想提供了包含通信、事務、併發、隊列、安全等一系列的整套的分佈式開發方案。
WCF 是 .NET 提供的一種服務,能夠將寫的完成特定功能的程序(如從數據庫中讀取數據操做等)封裝成服務,而後發佈到服務器上會生成一個網址,客戶端編程時能夠引用這個服務,使用服務中提供的功能。關於 WCF 的其餘信息參考:http://blog.csdn.net/fynjy/article/details/46874597
WCF架構
WCF Service經過 終結點(Endpoint) 發佈服務來實現網絡系統各個應用程序間的通訊,一個WCF Service由一個Endpoint集合組成。Endpoint是WCF實現通訊的核心要素,是服務器間通訊調用的入口,客戶端和服務端經過Endpoint交換信息。
當咱們寄宿 WCF 服務時,必須定義一個或多個終結點,而後 Serivce 端經過監聽這些終結點來處理 Client 發來的請求。因爲應用程序之間靠 Endpoint 通訊,那麼 Client 端也必須定義終結點,只有 Client 與 Service 的終結點徹底匹配時才能通訊。
namespace System.ServiceModel.Desc { // 表示容許服務的客戶端查找並與服務通訊的服務的終結點 public class ServiceEndpoint { public string Name { get; set; } // 服務終結點的名稱 public EndpointAddress Address { get; set; } // 服務終結點的終結點地址 public ContractDescription Contract { get; set; } // 服務終結點的協定 public Binding Binding { get; set; } // 服務終結點的綁定 } }
Endpoint由三個主要部分組成:
A:地址 - Address,服務的位置,Where to locate the WCF Service?:惟必定位服務,提供額外的尋址信息和認證信息
右鍵 SqhService.svc ,選擇在瀏覽器中查看,獲取該服務的惟一地址標識URI(WCF Service Address):http://localhost:18583/SqhService.svc
其中,URI(Uniform Resource Identifier)統一資源標識,格式:[Schema傳輸協議]://[主機名|域名|IP地址]:[端口號]/[資源路經]
namespace System.ServiceModel { // 提供客戶端用來與服務終結點進行通訊的惟一網絡地址。 public class EndpointAddress { public Uri Uri { get; } // 終結點的 URI,服務的惟一標識 public EndpointIdentity Identity { get; } // 用於驗證終結點的標識 public AddressHeaderCollection Headers { get; } // 獲取生成器能夠建立的終結點的地址標頭的集合 } }
對於終結點地址,是區別於服務地址的:終結點地址是服務地址的子地址,或相對地址;服務地址是終結點地址的父地址,或基地址,示例
服務地址:江陵路xx小區2號樓,樓房地址,只有一個,惟一標識服務
終結點地址:江陵路xx小區2號樓601室,門牌號地址,一個服務能夠包含多個終結點
下面給出網上的一段示例代碼,有助於理解服務地址和終結點地址的關係
// 服務地址 Uri baseAddress = new Uri("http://localhost:8000/MyService"); // 服務宿主 using(ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress)) { // 添加終結點(地址、綁定、服務協定) host.AddServiceEndpoint(typeof(IHelloWCFService), new WSHttpBinding(), "HelloWCFService"); // 元數據交換結點,用於元數據交換,並指定啓用元數據交換行爲 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; host.Description.Behaviors.Add(smb); // 啓動服務 host.Open(); // doSomething(...) host.Close(); }
其實,以上信息都可以在配置文件中實現,當配置發生改變時能夠不用從新編譯程序集。
B:綁定 - Binding,服務的通訊方式,How to communicate with service?,實現Client和Service通訊的全部底層細節,解決WCF服務的通訊問題;
在這給出支持雙工通訊的兩種協議:
C:契約 - Contract,服務的內容,What functionalities do the Service provide?,見下;
除此以外,還有一個 Behavior,用於定製Endpoint在運行時的一些必要的動做等。
WCF架構體系是基於攔截機制的,一個完整的 WCF 解決方案包括以下四個部分:
Metadata(元數據)
元數據交換(Metadata Exchange):服務端要提供服務的接口描述(或類型描述)、操做的方法簽名,相關的數據描述等給客戶端
配置文件
這裏給出配置文件的完整結構代碼,其中:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <!--配置服務和終結點--> <services> <service name="服務命名空間.服務協定" behaviorConfiguration="myBehavior"> // 宿主服務地址 <host> <baseAddresses> <add baseAddress="wcfURI"/> </baseAddresses> </host> // 服務終結點 <endpoint address="xxx" binding="wsHttpBinding" contract="服務命名空間.服務協定接口" bindingConfiguration="myBinding"></endpoint> // 元數據交換結點 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <!--配置綁定--> <bindings> <netTcpBinding> <binding name="myBinding"></binding> </netTcpBinding> </bindings> <!--配置行爲--> <behaviors> <serviceBehaviors> <behavior name="myBehavior"></behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
下面給出一個簡單的 WCF 程序的資源結構圖
注意,其中的 .svc 文件就是服務託管文件。
3.1 契約
WCF的基本概念是以 契約(Contract) 來定義雙方通訊的協議,合約必需要以接口的方式來體現,而實際的服務代碼必需要由這些合約接口派生並實現。契約與平臺無關、以XML格式發佈,是消息參與者之間的約定,提供服務通訊所必需的元數據。首先,瞭解下代碼中的幾種契約屬性的形式
// 數據協定 // 指定該類型要定義或實現一個數據協定,並可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)進行序列化 // 若要使其類型可序列化,類型做者必須爲其類型定義數據協定 [DataContract] // 數據成員協定 // 當應用於類型的成員時,指定該成員是數據協定的一部分並可由 System.Runtime.Serialization.DataContractSerializer 進行序列化 [DataMember] // 服務協定 // 指示接口或類在 應用程序中定義服務協定 [ServiceContract] // 操做協定 // 指示方法定義一個操做,該操做是 應用程序中服務協定的一部分 [OperationContract]
下面經過代碼示例,具體研究各個契約的用法
using System.ServiceModel; using System.Runtime.Serialization; using SqhWcfFunction; namespace SqhWcfService { [ServiceContract] // 服務契約 public interface ISqhService{ [OperationContract] // 操做契約 QueryOut QueryPersonInfoService(QueryIn inParam); } }
注:能夠在特性中使用Namespace和Name屬性,實現對命名空間和協定方法名稱的加密。具體信息在Service References:SqhService下的SqhService.wsdl文件中查看。其中,WSDL(網絡服務描述語言,Web Services Description Language)是基於XML的語言,用於描述Web Services、服務元數據以及如何對它們進行訪問。=> WSDL 教程 | W3School
下面的服務協定接口的實現
namespace SqhWcfService { public class SqhService : ISqhService { public QueryOut QueryPersonInfoService(QueryIn inParam) { QueryOut outParam = new QueryOut(); try { outParam = SqhServiceFunction.QueryPersonInfo(inParam); } catch (Exception e) { outParam.ErrMsg = "查詢person信息時發生異常," + e.Message; outParam.isSuccessed = false; return outParam; } return outParam; } } }
其中,SqhWcfFunction.SqhServiceFunction 是專門定義的數據處理函數類。
using System.ServiceModel; using System.Runtime.Serialization; namespace SqhWcfFunction { [DataContract] // 數據契約 public class QueryIn{ [DataMember] // 數據成員契約,標識類型可序列化 public string personID; [DataMember] public string personName; } [DataContract] public class QueryOut{ [DataMember] public string personResInfo; [DataMember] public bool isSuccessed; } }
關於數據協定的詳細使用,可參見:WCF - 數據協定;
更好地控制SOAP頭和SOAP體,支持序列化期間的安全機制。全部的消息契約必須實現一個public的無參構造函數。
給出一個 WCF 的簡單 Demo,參見:http://www.cnblogs.com/iamlilinfeng/p/4083827.html
3.2 宿主程序
WCF自己不可以獨自運行,必須寄宿在一個宿主進程(Host Process)中。服務寄宿的目的就是開啓一個進程,爲WCF服務提供一個運行的環境。單個宿主進程能夠託管多個服務,相同的服務也能夠託管在多個宿主進程中。
關於經過控制檯承載寄宿服務,相關資料可參見:http://blog.csdn.net/songyefei/article/details/7363296
關於在 IIS 中寄宿 WCF 服務
在 IIS 中宿主服務的主要優勢:發生客戶端請求時宿主進程會被自動啓動,而且能夠依靠 IIS 管理宿主進程的生命週期
相關資料可參見:
首先,一個服務要部署到 IIS 上,必需要生成待部署的文件包,具體操做:
[1]. 右鍵項目,生成部署包 [2]. ...\obj\Debug\Package\PackageTmp\ 目錄下的文件就是待部署的文件 [3]. PackageTmp 下的文件所有拷貝到 IIS 下的相關文件夾中便可
下面對 IIS 寄宿 WCF 服務中遇到的幾個問題進行總結:
問題1: 「/SQHWCFSERVICE」應用程序中的服務器錯誤。 配置錯誤 說明: 在處理向該請求提供服務所需的配置文件時出錯。請檢查下面的特定錯誤詳細信息並適當地修改配置文件。 分析器錯誤消息: 沒法識別的屬性「targetFramework」。請注意屬性名稱區分大小寫。 源錯誤: <compilation debug="true" targetFramework="4.0"/> 版本信息: Microsoft .NET Framework 版本:2.0.50727.4961; ASP.NET 版本:2.0.50727.4955
緣由:.NET Framework 版本不匹配,IIS 配置 和 程序配置的版本不一致
解決方法:修改.NET Framework 版本爲相應版本,將 2.0 改成 4.0 版本
具體參見:http://blog.csdn.net/muchlin/article/details/6800863
問題2: 應用程序「NET/CRM」中的服務器錯誤 Internet Information Services 7.5 錯誤摘要:HTTP 錯誤 404.2 - Not Found 因爲 Web 服務器上的「ISAPI 和 CGI 限制」列表設置,沒法提供您請求的頁面。
緣由:ISAPI和CGI限制沒有容許須要的版本
解決方法:具體可參見上面的連接。
注意,若是ISAPI和CGI限制列表中不包含須要的版本,須要手動添加 C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll
問題3: 經過IIS直接瀏覽頁面時報錯:HTTP 錯誤 404.3 - Not Found 因爲擴展配置問題而沒法提供您請求的頁面。 若是該頁面是腳本,請添加處理程序。若是應下載文件,請添加 MIME 映射。
解決方法:爲 IIS 從新註冊 .net framework 4.0,具體參見:http://blog.csdn.net/g200407331/article/details/9078219
注意,要以管理員權限運行Visual Studio 命令提示工具,該工具在電腦左下角的開始中能夠找到。
爲了保險起見,在 IIS 根目錄下,雙擊 MIME 類型,添加以下信息
文件擴展名:.json MIME 類型:application/json
3.3 服務
Service:服務定義,注重邏輯
using System.ServiceModel; using System.Runtime.Serialization; using SqhWcfFunction; namespace SqhWcfService{ public class SqhService : ISqhService { public QueryOut QueryPersonInfoService(QueryIn inParam) { QueryOut outParam = new QueryOut(); try{ outParam = SqhServiceFunction.QueryPersonInfo(inParam); } catch (Exception e){ outParam.ErrMsg = "查詢person信息時發生異常," + e.Message; outParam.isSuccessed = false; return outParam; } return outParam; } } }
Function:服務函數,具體實現
namespace SqhWcfFunction{ public class SqhServiceFunction { public static QueryOut QueryPersonInfo(QueryIn inParam) { QueryOut outParam = new QueryOut(); try{ // 動態SQL、訪問數據庫等其餘各類操做 outParam.isSuccessed = true; outParam.personResInfo = string.Format("My WCF Service:{0}-{1}", inParam.personID, inParam.personName); } catch (Exception e){ outParam.ErrMsg = "查詢失敗" + e.Message; outParam.isSuccessed = false; return outParam; } return outParam; } } }
3.4 客戶端
客戶端應用程序經過代理類與WCF服務進行通訊,代理類爲WCF服務實現了服務契約接口,對這個接口的操做方法的全部調用都重定向到WCF服務上。
using System.ServiceModel; using System.Runtime.Serialization; using SqhWcfClient.SqhService; namespace SqhWcfClient { public class Program{ static void Main(string[] args){ SqhServiceClient SqhClient = new SqhServiceClient(); // 客戶端 QueryIn inParam = new QueryIn(){ personID = "001", personName = "sqh" }; QueryOut outParam = SqhClient.QueryPersonInfoService(inParam); if(outParam.isSuccessed) Console.WriteLine(outParam.personResInfo); SqhClient.Close(); // 關閉客戶端 } } }
關於雙工消息通訊模式(異步)的實現
WCF 支持多種消息格式:單向、請求/回覆、雙工,但必須綁定對應的協議。
三種方式的基本流程參見:WCF 通訊模式;
該部分經過一個簡單的加法方法來了解 WCF 的雙工通訊方式:
[1]. 服務端
首先給出服務協定接口的代碼,注意服務接口和服務回調接口的命名方式
using System.ServiceModel; namespace sqhWcfService { [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceAsyncCallback))] public interface IServiceAsync { [OperationContract(IsOneWay = true)] void AddTwoInteger(int a, int b); } [ServiceContract] public interface IServiceAsyncCallback { [OperationContract(IsOneWay = true)] void ReturnResult(int c); } }
在服務端,須要實現服務協定接口的方法,服務協定回調接口的方法在客戶端實現。服務協定接口必須指明 SessionMode.Required 和 回調協定屬性。注意接口命名格式,推薦: 服務協定回調接口 = 服務協定接口 + Callback
using System.ServiceModel; namespace sqhWcfService { public class ServiceAsync : IServiceAsync { public void AddTwoInteger(int a, int b) { int result = a + b; Console.WriteLine("AddTwoInteger:{0}", result); IServiceAsyncCallback callback = OperationContext.Current.GetCallbackChannel<IServiceAsyncCallback>(); callback.ReturnResult(result); } } }
注意,在 Web.config 文件 <system.serviceModel> 結點下添加以下結點
<services> <service name="sqhWcfService.ServiceAsync"> <endpoint address="ServiceAsync" binding="wsDualHttpBinding" contract="sqhWcfService.IServiceAsync" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>
注意,雙工通訊必須是 wsDualHttpBinding 綁定,該屬性會創建兩條綁定實現互相調用,也能夠是 NetTcpBinding。
至此,服務端配置完畢,記錄下服務的地址備用。
[2]. 客戶端
首先添加服務引用,命名爲:sqhWcfServiceReference,而後實現服務回調接口的方法
using sqhWcfClient.sqhWcfServiceReference; namespace sqhWcfClient { public class ServicAsyncCallback : IServiceAsyncCallback { public void ReturnResult(int c) { int result = c; Console.WriteLine("ReturnResult:{0}", result); } } }
下面是實例化客戶端、調用服務的代碼
using sqhWcfClient.sqhWcfServiceReference; namespace sqhWcfClient { public class Program { public static void Main(string[] args) { // 服務回調對象 ServicAsyncCallback callbackObj = new ServicAsyncCallback(); // 服務回調上下文,維護一個服務回調對象 InstanceContext callbackInstance = new InstanceContext(callbackObj); // 利用上下文實例對象初始化代理客戶端對象 ServiceAsyncClient client = new ServiceAsyncClient(callbackInstance); client.AddTwoInteger(1, 2); } } }
至此,客戶端代碼配置完畢。運行客戶端,便可調用服務方法完成加法實現。爲了查看異步調用的效果,能夠再客戶端代碼和服務端代碼中添加延時。
詳細實現信息參見:消息通訊模式(下)- 雙工;在 WCF 中實現雙工通訊深刻理解 - Artech;
關於利用 WCF服務庫 提供服務
上面介紹的 WCF 服務均是經過 VS新建項目 -> WCF服務應用程序 的方式提供服務,此處介紹經過 VS新建項目 -> WCF服務庫 的方式提供服務並部署到 IIS 上。首先了解下 WCF服務應用程序 和 WCF服務庫 的區別:
其餘區別的詳細信息能夠參見:WCF Service Application -VS- WCF Service Library;WCF服務應用程序 - WCF服務庫;
在項目工做中,推薦使用 WCF服務庫,某個服務的類定義爲一個單獨能夠編譯的類庫,低耦合,能夠爲其餘項目使用、提升代碼的複用性。
下面的 WCF服務,包含2個 WCF 服務庫(具體的獨立的服務,CalculateService 和 CertificateService)和1個 ASP.NET 空 Web 應用程序(包含2個WCF服務類庫,對外提供服務)
[1]. 建立WCF服務庫
首先,分別建立2個獨立的WCF服務庫:CalculateService(計算服務) 和 CertificateService(註冊服務),下面直接給出代碼:
(1)CalculateService
1 namespace RVC.WCF.Calculate 2 { 3 [ServiceContract] 4 public interface ICalculateService 5 { 6 [OperationContract] 7 double Add(double a, double b); 8 [OperationContract] 9 double Minus(double a, double b); 10 [OperationContract] 11 double Multiple(double a, double b); 12 [OperationContract] 13 double Divide(double a, double b); 14 } 15 }
1 namespace RVC.WCF.Calculate 2 { 3 public class CalculateService : ICalculateService 4 { 5 public double Add(double a, double b) { 6 return a + b; 7 } 8 9 public double Minus(double a, double b) { 10 return a - b; 11 } 12 13 public double Multiple(double a, double b) { 14 return a * b; 15 } 16 17 public double Divide(double a, double b) { 18 if ((int)b == 0){ 19 return double.MaxValue; 20 } 21 return a * 1.0 / b; 22 } 23 } 24 }
(2)CertificateService
1 namespace RVC.WCF.Certificate 2 { 3 [ServiceContract] 4 public interface ICertificateService 5 { 6 [OperationContract] 7 string CertificateUser(string userName, string passWord); 8 [OperationContract] 9 UserInfo GetUserInfo(string userID); 10 [OperationContract] 11 bool CancelUser(string userID); 12 } 13 }
namespace RVC.WCF.Certificate { public class CertificateService : ICertificateService { private static Dictionary<string, UserInfo> UserDic = new Dictionary<string, UserInfo>(); public string CertificateUser(string userName, string passWord) { string userID = DateTime.Now.ToShortTimeString() + passWord; UserInfo user = new UserInfo() { UserID = userID, UserName = userName, Password = passWord, CertTime = DateTime.Now }; if (UserDic.ContainsKey(user.UserID)) { throw new Exception("該用戶已存在"); } UserDic.Add(user.UserID, user); return userID; } public UserInfo GetUserInfo(string userID) { UserInfo ret = new UserInfo(); if (!UserDic.ContainsKey(userID)){ throw new Exception("該用戶不存在"); } ret = UserDic[userID]; return ret; } public bool CancelUser(string userID) { if (!UserDic.ContainsKey(userID)){ throw new Exception("該用戶不存在"); } UserDic.Remove(userID); return true; } } }
1 namespace RVC.WCF.Certificate 2 { 3 [DataContract] 4 public class UserInfo 5 { 6 [DataMember] 7 public string UserID; 8 [DataMember] 9 public string UserName; 10 [DataMember] 11 public string Password; 12 [DataMember] 13 public DateTime CertTime; 14 } 15 }
建立的 WCF服務庫,僅需新增 .cs接口文件 和 .svc.cs接口實現文件,配置文件 App.config 暫時無需改動。注意代碼僅供參考,不要過於講究細節。
[2]. 包裝WCF服務庫
建立好的 WCF服務庫不能直接運行,須要宿主託管才能執行。經過 VS新建項目 -> ASP.NET 空 Web 應用程序,做爲該 WCF服務類庫的 Host 將上述 WCF服務類庫包含進來。
每個 ASP.NET Web服務 都具備一個 .asmx 文件,客戶端經過訪問 .asmx 文件實現對相應 web 服務的調用。相似,每一個 WCF 服務也具備一個對應的文件,即 .svc 文件。基於 IIS 的服務寄宿要求相應的 WCF 服務具備相應的 .svc 文件,.svc 文件部署於 IIS 站點中,對 WCF 服務的調用體如今對 .svc 文件的訪問上。
(1)右鍵項目,添加一個文件夾,命名爲 Services
(2)右鍵 Services 文件夾,添加 WCF服務 文件,分別命名爲 CalculateService.svc 和 CertificateService.svc,同時將 .cs接口文件 和 .svc.cs接口實現文件刪除,只留下 .svc服務託管文件
(3)依次修改 .svc 文件爲以下形式,分別指向對應的服務實現文件
// CalculatorService <%@ ServiceHost Language="C#" Debug="true" Service="RVC.WCF.Calculator.CalculatorService" CodeBehind="CalculateService.svc.cs" %> // CertificateService <%@ ServiceHost Language="C#" Debug="true" Service="RVC.WCF.Certificate.CertificateService" CodeBehind="CertificateService.svc.cs" %>
其中 Service = "命名空間.服務名稱" 表示提供的服務,CodeBehind = "服務接口實現文件" 表示服務實現類。
除此以外,Web.config 暫不改動。至此,服務相關文件所有建立完畢,下面給出資源結構圖
其中,右圖是爲了調試方便,將2個WCF服務類庫項目添加到了該Web應用程序中。
爲了驗證服務是否能運行,右鍵 RVC.WCF.Service,選擇 在瀏覽器中查看 並進入 Services 文件夾
點擊便可查看服務運行狀況。
[3]. 在 IIS 上發佈 WCF 服務
一樣是右鍵 RVC.WCF.Service,選擇 生成部署包,生成文件路徑:...\RVC.WCF.Service\obj\Debug\Package\PackageTmp
將該文件夾下的文件複製到 IIS 的相關路徑下,在 IIS -> 網站 -> 添加網站 或 IIS -> 網站 -> Default Web Site -> 添加應用程序 並指向該路徑便可。
至此,將該 WCF 服務成功發佈到 IIS 上。
推薦文章:WCF4.0新特性體驗(7):IIS無SVC文件託管WCF服務(IIS hosting without an SVC file );
在 WCF 學習中遇到的一些問題
[1]. 如何讀取配置文件中 endpoint 結點的地址?
// 方法1 SqhServiceClient SqhClient = new SqhServiceClient(); var endpoint = SqhClient.Endpoint; // 方法2 string sectionPath = "system.serviceModel/client"; var clientNode = (ClientSection)ConfigurationManager.GetSection(sectionPath); var endpoints = clientNode.Endpoints;
其中,方法1只能讀取某個終結點的信息,而方法2能夠讀取該服務下全部終結點的信息。
關於方法2的具體解決方法參見:http://www.cnblogs.com/huangxincheng/p/4396284.html