WCF

 第一步:創建一個空的解決方案,解決方案中有四個項目:

    

  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程序就此做完了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章