第一步:創建一個空的解決方案,解決方案中有四個項目:
IService項目需要引用System.ServiceModel 定義了服務契約的類庫項目,
CalculatorService項目引用IService項目,用於定義服務類型的項目,實現IService項目中定義的服務契約,
WcfHost項目 是作爲宿主的控制檯項目,
WcfClient 項目是模擬服務的客戶端程序。
第二步:創建服務契約
namespace IService { [ServiceContract(Name = "CalculatorService", Namespace = "http://www.sun.com/")] public interface ICalculatorService { [OperationContract] double add(double x, double y); [OperationContract] double Subtract(double x, double y); [OperationContract] double Mul(double x, double y); [OperationContract] double Divide(double x, double y); } }
服務契約其實就是一接口,抽象定義服務的所有操作,說直白點,就是兩個人說定好,我們該這樣做,我們需要在接口上加上ServiceContract 特性 ,將其定義成服務契約,此外還需要說明契約的名稱和命名空間。另外還需要在各個方法上定義OperationContract 特性,這樣才能暴露給別人調用。
第三步: 創建服務
創建服務其實就是實現剛剛寫好的接口
public class CalculatorService:ICalculatorService { public double add(double x, double y) { return x + y; } public double Subtract(double x, double y) { return x - y; } public double Mul(double x, double y) { return x * y; } public double Divide(double x, double y) { return x / y; } }
第四步:通過自我寄宿的方式寄宿服務
服務寄宿有兩種方式:寄宿在IIS裏面,自我寄宿的方式。我們這裏使用的是自我寄宿的方式,即通過控制檯的方式寄宿。
WCF 採用終結點的方式進行通訊,終結點由即所謂的ABC組成,A-Address B-Binding C-Contract 三元素組成,很好記得。
地址(Address):決定服務的位置,解決服務尋址的問題。
綁定(Banding):實現通訊的所有細節,包括網絡傳輸,信息編碼等等,WCF中有BasicHttpbinding,WSHttpbinding等等,
契約(Contract):對服務契約的抽象操作。
class Program { static void Main(string[] args) { using(ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Opened += delegate { Console.WriteLine("服務啓動。。。"); }; host.Open(); Console.Read(); } } }
當然這樣肯定不行,我們需要在配置文件中配置剛剛所說的ABC 及終結點:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/calculatorservice/metadatebehavior" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="CalculatorServices.CalculatorService" behaviorConfiguration="metadataBehavior"> <endpoint address="http://localhost:8080/calculatorservice" binding="wsHttpBinding" contract="IService.ICalculatorService"/> </service> </services> </system.serviceModel> </configuration>
配置這裏有幾個坑 behaviorConfiguration屬性的值必須在前面已經配置好<behavior name="metadataBehavior"> 節點 。<service name="CalculatorServices.CalculatorService" 這裏的name值爲繼承了服務契約的完整類引用,包括完整的命名空間。即實現了接口的類。 contract="IService.ICalculatorService"/> contract的值爲服務契約的類引用,即我們創建的接口。
宿主做好了 我們需要把宿主運行起來,這樣客戶端才能引用我們的服務,在運行宿主程序時又遇到一個坑了,直接運行報 HTTP 無法註冊 URL http://+:8080/calculatorservice/。進程不具有此命名空間的訪問權限 這個錯誤。原來宿主程序需要用管理員權限運行,我們關掉VS 以管理員權限打開再次運行就可以
第五步:創建客戶端調用程序
這裏也有個坑 地址是<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/calculatorservice/metadatebehavior" /> 節點中的地址
客戶端調用程序很簡單:
class Program
{
static void Main(string[] args)
{
MSR.CalculatorServiceClient client = new MSR.CalculatorServiceClient();
//調用Add()方法
double add = client.add(1, 1);
Console.WriteLine(add);
//調用Subtract()方法
double sub = client.Subtract(2, 1);
Console.WriteLine(sub);
//調用Mul()方法
double mul = client.Mul(2, 1);
Console.WriteLine(mul);
//調用div()方法
double div = client.Divide(2, 1);
Console.WriteLine(div);
Console.Read();
}
}
至此一個簡單的WCF程序就此做完了。