一個簡單WCF項目的建立 by wsz


      由於搬磚的需要,不得不學一點與WCF有關的東西。具體是因為前幾周在64位環境下寫的一個dll不能被集成到合作伙伴的32位工程中,但是要修改文件實在是划不來,一個壓縮后600M的文件搬來搬去的也是讓人蛋碎。因此想到了WCF。這樣只要提供一個service,運行一個host,然后在client上調用就可以了。貌似是一件很簡單的事,但是卻做了整一下午還多。

  WCF的確是個好東西,從功能來看,WCF可以看作是ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等很多我不懂的技術的並集。WCF中支持的傳輸協議包括HTTP、TCP、Peer network等很多我不懂的協議。簡單介紹一下HTTP,和TCP的地址類型,大概是這樣子的:

HTTP地址
        即使用HTTP協議進行傳輸(包括https安全傳輸協議)。其地址形式為
        http://localhost:8000/
        如果地址中為制定端口號,則默認端口為80
TCP地址
        使用TCP協議進行傳輸,其形式為:
        net.tcp://localhost:8000/

下午經歷了一個由HTTP到TCP過度的一個痛苦過程。個人感覺TCP要比HTTP麻煩那么一點。就用HTTP協議簡單介紹一下這個建立過程。

 

一個簡單的WCF

建立host可以用兩種方式,一種是直接建立一個WCF服務集+一個host項目,另一種是建立兩個類庫+一個host項目。直觀的區別是用服務集可以將interface和service放在一個項目下;否則就是用一個類庫作為interface,另一個作為service。這里就用兩個類庫為例吧。先在解決方案中添加一個類庫取名Contract作為服務契約(要添加ServiceModel的引用),在建立一個Service類庫(要添加ServiceModel和Contract的引用)。在Contract中寫一個簡單的interface如下(用來計算a與b的和):

namespace Contract

{

    [ServiceContract]

    public interface ICaculate

    {

        [OperationContract]

        int Caculate(int a,int b);

    }

}

[ServiceContract]表示服務契約,就是在ServiceModel的引用下的。

在Service中實現這個類

namespace Service

{

    public class myCaculate:ICaculate

    {

        public int Caculate(int x, int y)

        {

            return x + y;

        }

    }

}

接下來添加一個Host項目比如一個控制台程序,大概是這樣的(要把Host設置為主項):

 

在Host項目中要添加ServiceModel,Service和Contract的引用。這里有兩種方式寫Program中的代碼。一種是直接在代碼寫協議的類型,另一種是在App.config中設置協議。這里用配置文件的方式,因為這樣host中的代碼會非常簡單,而且個人感覺App.config在WCF中扮演一個很犀利的角色。這需要我們先生成一個大概的App.config代碼框架,再根據具體情況設置參數(如果整個配置文件都是手寫的,那只能Or2)。具體的編輯工具在VS2010的工具à服務配置編輯器中。打開Host中的配置文件,主要的任務是添加service和behavior,此外要建立一個url作為endpoint。這里選擇basicHttpBinding綁定方式。具體操作很簡單就不贅述了,用起來很方便。重要的是設置完成之后別忘了保存,否則就白費了。生成的配置文件大概是這樣的:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="Behavior0">

                    <serviceMetadata httpGetEnabled="true" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="Behavior0" name="Service.myCaculate">

                <endpoint address="http://localhost:8080/HelloService" binding="basicHttpBinding"

                    bindingConfiguration="" contract="Contract.ICaculate" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8080/HelloService" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>

Behavior的名字是隨便取的,這里的url是http://localhost:8080/HelloService。

這樣host的main函數中代碼就很簡單了

    ServiceHost host = new ServiceHost(typeof(myCaculate));

            host.Open();

            Console.WriteLine("Start Your Service.");

            Console.ReadKey();

            host.Close();

這么幾行就夠了。這樣host就可以運行了。接下來建立一個控制台程序作為Client。建立好之后,先讓Host運行起來,然后在client的引用中添加ServiceReferences http://localhost:8080/HelloService

這樣在Client的代碼中就可以調用Service中的myCaculate類來計算兩個數的和了。

在Client中可以直接調用Service(代碼比較麻煩)或者通過代理調用(簡單多了)。

代理調用的代碼如下:

ServiceReference1.CaculateClient ca = new ServiceReference1.CaculateClient();

        Console.WriteLine(ca.Caculate(6, 7));

一個簡單的http協議的WCF就是在這樣了。在Host的App.Config中可以進行很多參數的設定,比如傳輸的最大字節,timeout等。都根據具體的需要進行設定。對於TCP協議的要麻煩一點。不過大體流程是一樣的。

         WCF的跨平台性很好,而且集成了多種協議,微軟的這個產品的確令人佩服。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM