一个简单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的跨平台性很好,而且集成了多种协议,微软的这个产品的确令人佩服。

posted @ 2012-08-30 23:21  smart-code  阅读(945)  评论(81编辑  收藏  举报