WCF(一)

Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口可以翻译为Windows通讯接口,它是.NET框架的一部分。

第一次认识WCF的时候,完全摸不着头脑,眼看着代码这一堆那一堆,根本分不清啥是啥,更抓狂的是看到config文件中那么多,眼花缭乱的,纯粹给人一种神秘且高深莫测的感觉。于是我的第一轮WCF学习是失败的。

始终不明就里,始终心理痒痒的,都做了开发了都认识了WCF了却不会,感觉就是眼前有位美丽的姑娘,戴着面罩犹抱琵琶半遮面,恨不得跑过去摘下她的面罩一睹芳容~~正好最近项目不是那么紧,抽时间出来鼓起勇气去摘了一次这位“美女”的面罩,嘎嘎,可恶的我不仅仅要自己一睹芳容,还要跟你们分享一下下哈哈...期待吧?

来,咱们共同审视一下这位楚楚动人的美女

第一步:创建“WCF服务库”

“文件(F)”->“新建项目(P)...”打开新建项目对话框。在左侧的“项目类型”中选择“WCF”,然后再在右侧的“模板”中选择“WCF服务库”。

在下面的“名称”文本框中,填写我们要创建的WCF服务库的项目名称“Services”。

点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。

这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。

第二步:创建Book实体类,在WCF服务库中创建Book实体类

第三步:为Book实体类编写代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.Serialization;

 

namespace Services

{

[DataContract]

    public class Book

    {

        [DataMember]

        public string BookNO;

        [DataMember]

        public string BookName;

        [DataMember]

        public decimal BookPrice;

    }

}

 

为了保证此类在WCF调用中能够被序列化,我们在Book类上面加入[DataContract]标签,在每个需要序列化的成员变量上加入[DataMember]标签。这两个标签在使用的进候需要导入using System.Runtime.Serialization命名空间。

到此为至,我们创建完了需要在服务中传输的复杂的数据类型Book。

第四步:创建服务接口

创建服务接口,为了声明对外发布的类和方法。

在“解决方案窗口”中,我们右击Services项目名,选择“添加”,再单击“类”在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“IBookService.cs”。

 

在此类文件中我们编写服务接口,代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

 

namespace Services

{

    [ServiceContract]

    public interface IBookService

    {

        [OperationContract]

        void AddBooks(Book book);

 

        [OperationContract]

        List<Book> GetAllBooks();

 

        [OperationContract]

        void RemoveBook(string id);

    }

}

 

在IBookService接口上面,我们定义了[ServiceContract]标签,此标签代表此接口及实现此接口的类都是对外发布的Service类,在每个需要对外发布的方法上都加上[OperationContract]标签,以使外部可以访问到此方法。

[ServiceContract]和[OperationContract]这两个标签需要导入using System.ServiceModel命名空间。

第五步:创建实现服务接口的类

实现我们上面声明的服务接口,实现对Book的添加、删除和检索的具体功能。

在“解决方案窗口”中,我们右击Services项目名,选择“添加”,再单击“类”

在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“BookService.cs”。

在此类文件中编写代码实现IBookService.cs服务接口。

using System;

using System.Collections.Generic;

using System.Linq;

using System.ServiceModel;

using System.Text;

 

namespace Services

    {

    [ServiceContract]

    public interface IBookService

        {

        [OperationContract]

        void AddBooks(Book book);

 

        [OperationContract]

        List<Book> GetAllBooks();

 

        [OperationContract]

        void RemoveBook(string id);

        }

    }

此类是对IBookService接口的具体实现,需要导入using System.ServiceModel;命名空间。

第六步:配置WCF服务(惊险刺激的来啦...)

到目前为至,我们建立好了WCF服务,那我们如何让WCFSVCHost(WCF服务主机)理解我们编写的服务类,并能够运行我们编写的服务呢。这需要我们在App.Config里面注册一下我们的WCF服务。

这个是配置文件,发出来恶心一下

<?xml version="1.0"?>

<configuration>

 

  <configSections>

  </configSections>

  <connectionStrings>

    <add name="Services.Properties.Settings.WCFBookTestConnectionString"

      connectionString="Data Source=PACK05;Initial Catalog=WCFBookTest;User ID=sa;Password=pack"

      providerName="System.Data.SqlClient" />

  </connectionStrings>

  <system.web>

    <compilation debug="true"/>

  </system.web>

  <!-- 部署服务库项目时,必须将配置文件的内容添加到

  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->

  <system.serviceModel>

    <services>

      <service name="Services.BookService">

        <endpoint address="" binding="wsHttpBinding" contract="Services.IBookService">

          <identity>

            <dns value="localhost"/>

          </identity>

        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:8732/Design_Time_Addresses/Services/Service1/"/>

          </baseAddresses>

        </host>

      </service>

    </services>

    <behaviors>

      <serviceBehaviors>

        <behavior>

          <!-- 为避免泄漏元数据信息,

          请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->

          <serviceMetadata httpGetEnabled="True"/>

          <!-- 要接收故障异常详细信息以进行调试,

          请将以下值设置为 true。在部署前设置为 false

            以避免泄漏异常信息-->

          <serviceDebug includeExceptionDetailInFaults="False"/>

        </behavior>

      </serviceBehaviors>

    </behaviors>

  </system.serviceModel>

 

<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

 

这么多东西谁能记得下?!!!

没关系,VS2010为我们提供了可视化的操作界面。貌似vs2008也有,2005不知道有没有,没用过...

在Services项目中右击“App.Config”配置文件,在弹出的右键菜单中选择“编辑WCF配置”。

弹出界面如下:

 

 

 

 

在此界面中暴露两个对外的终结点(外部可以访问到的类或接口),其中下面一个是元数据终结点,用来向外提供服务信息的终结点。而另一个(即上面的终结点),是向外公布我们编写的[ServiceContract]的类,但我们可以看到它的Contract还是我们在第一步中删掉的Services.IService1这个终结点。不仅如此,在右侧的服务中还依旧是我们在第一步中删除的Services.Service1服务。这说明虽然在第一步中我们删除了那两个自动生成的类文件,但配置文件中仍没有删除这两个类文件的配置信息。

下面我们把它们改变一下。

单击左侧的“服务”-“Services.Service1”在右侧的Name,弹出“服务类型浏览器”对话框,在此类型中我们找到此WCF服务项目编译出来的Services.dll文件,双击它就可以出现此服务中的对外公布的服务,点击选中它单击确定。

 

 

 

 

 

这样我们就可以把对外公司的服务改变为我们刚编写的服务了。

然后,我们展开左侧“服务”->“Services.BookService”->“终结点”,单击第一个“空名称”,从右边的“终结点属性”中的Contract中我们可以看到,这里的Contract仍然用的是Services.IService1。那我们按照上面的做法,找到此WCF服务项目编译出来的Services.dll,双击它找到里面对应的ServiceContract点击确定就可以了。

点击菜单“文件”-“保存”就可以把我们对App.Config的修改保存回配置文件了。

OK,现在我们对WCF的配置算是完成了

第七步:运行WCF进行测试。

在VS2008中为我们提供了测试WCF的工具,按F5启动WCF会出现两个东西

一个是在右下角的托盘图标中会出现WCFSVCHost(WCF服务主机),它为我们在开发时候提供了一个运行WCF的服务器,用来为测试客户端提供WCF服务。

 

 

另一个是“WCF测试客户端” 

 

 

 

 

“测试客户端”从WcfSVCHost中取得WCF服务的元数据,解析为右侧的“服务结构树”,从这里面我们可以看到此WCF服务为我们提供了一个服务契约“IBookService”,此服务契约中对外提供了三个可调用的方法。

双击AddBooks()方法,我们可以从右面输入相关的数据然后点击“调用”,就可以把数据送给WCF服务器,去调用对应的方法了。

双击GetAllBooks方法,我们可以查看添加的书的信息。双击RemoveBoo()方法就可以把书删除。(啥?你双击了都没有调用?介孩子,怪懒的,双击了是在右侧打开了一个窗口,怎么说你也得点击一下那个调用按钮噻)。

好了吧?我们的WCF服务库算是完成了。

接下来我们使用IIS发布WCF服务

 

一:新建WCF服务站点。在解决方案上右击,选择“添加”->“新建网站”,打开新建网站对话框。在“添加新网站”对话框中,我们选择“WCF服务”,并把网站的名子命名为“BookServiceHost”

建立起来的新的WCF服务站点的结果如下,其中在App_Code文件中自动为我们生成两个类文件:IService.cs和Service.cs。这两个文件对我们来说没有用,我们删掉。

二:在刚刚创建的WCF服务站点上添加对WCF服务库项目--Services项目的引用。

 

 

 

 

 

三:配置Service.svc文件。

双击Service.svc文件,我们可以看到它的声明指示如下:

<%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" %>

由于在第二步中我们已经把IService.cs和Service.cs两个文件已经删除了,所以这里的声明指示内容修改一下,让这个Service.svc文件的后台代码指向我们上次创建的WCF服务库项目--Services项目中的类,改后的代码如下:

<%@ ServiceHost Language="C#" Debug="true" Service="Services.BookService"%>

我们把其中的Service属性指定为Services命名空间下的BookService类,并把CodeBehind属性删去了。

四:配置此WCF服务站点与WCF服务库项目之间的类的对应。

虽然在第三步中我们添加了对Services项目的引用,并且在第四步中修改了Service.svc的类的对应,但此时我们的WCF服务站点并不能把WCF服务库中的服务和终结点发布出来,还需要我们对web.config进行一系列的配置工作。

在web.config上右击选择“编辑WCF配置”

在弹出的服务配置窗口中,把Service服务指定到WCF服务库的Services.dll中的Services.BookService服务类上。

 

 

 

 

点击右变name上的按钮可以选择的。再把其中的一个对外终结点的Contract设为WCF服务库的Services.dll中的Services.IBookService服务契约上。

 

 

 

 

 

当我们使用IIS5或IIS6发布WCF服务的时候一般只创建Http绑定的终结点,而不能创建使用TCP绑定、管道绑定的终结点。

四:测试运行WCF服务站点。

在Service.svc上右击,选择“在浏览器中查看”,在IE中运行此服务。

 

 

 

 

五:在IIS布署此WCF服务站点。

在IIS建立Web应用程,指向我们的WCF服务站点所在的目录。然后在IIS运行我们发布的WCF服务,在IIS中直接浏览Service.svc

 

 

 

看到有啥变化木有?从上图中我们看到发布的站点中不再包含有端口号。

到此为至我们在IIS中发布WCF服务成功。

 

好啦好啦,可以测试一下了。再建立一个WCFTestClient控制台应用程序。用于测试的。

添加服务器引用Services,然后再program中添加代码  IBookService ser = new BookServiceClient();

            Book b=new Book();

            b.BookName = "人才学";

            b.BookPrice = (decimal)25.2;

            b.BookNO = "012";

 

            ser.AddBooks(b);

          var list=  ser.GetAllBooks();

            if (list!=null)

            {

                foreach (var book in list)

                {

                    Console.WriteLine(book.BookName);

                } 

            }

Ctrl+F5试一下~~哈哈  至此,我们就成功的创建了一个以IIS为宿主的WCF服务。美吧?惊艳吧?我得儿意的笑,我得儿意的笑…感觉跟个色狼似的,其实我才是个姑娘,哈哈

 

 

 

我使用的是freamwork3.5,你看看你自己的是不是4.0,如果你在IIS里浏览说不识别<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>中的multipleSiteBindingsEnabled时,你直接在Config中注释掉他就是了。如果说让你添加<behavior >中添加name嘛 你就加一个好了<behavior name="MyServiceTypeBehaviors">顺便在

<servicename="Services.BookService" >中添加一下behaviorConfiguration。

<servicename="Services.BookService"behaviorConfiguration="MyServiceTypeBehaviors">就OK了

了解了一下WCF的典型宿主包括以下四种:

1、"Self-Hosting" in a Managed Application(自托管宿主)

2、Managed Windows Services(Windows Services宿主)

3、Internet Information Services(IIS宿主)

4、Windows Process Activation Service(WAS宿主)

不过用IIS宿主的比较频繁,所以我就只简单的学习了一下IIS的。以后学了其它的我们再来讨论共享…口干舌燥的,说了这么多。真的很美,需要好好研究下

转载于:https://www.cnblogs.com/hexinxiaoyao/archive/2013/04/09/3010155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值