WCF学习(二)创建简单的服务和客户端

下面是创建服务和客户端的步骤:

(1)创建服务和数据协定;

(2)使用EF创建访问数据库的库文件;

(3)实现服务;

(4)使用WCF服务宿主(Service Host)和WCF测试客户端(Test Client);

(5)创建定制的服务宿主;

(6)使用元数据创建客户端应用程序;

(7)使用共享的协定创建客户端应用程序;

(8)配置诊断设置。

2.1定义服务和数据协定

定义数据类,这个类定义数据库中需要的数据,并在网络中传送。要通过WCF服务发送数据,应该在该类附加DataContract和DataMember属性。System.ComponentModel.DataAnnotation命名空间中的Stringlength属性不仅可以用于用户输入验证,还可以在创建数据表时定义列的模式。

接着创建服务协定,服务提供的操作可以通过接口来定义。服务协定用ServiceContract属性定义。由服务提供的操作应用了OperationContract属性。

2.2数据访问

定义服务接口实际的操作,操作数据库读写数据。

2.3服务的实现

现在开始实现服务。创建一个WCF服务库RoomReservationService。这个库默认包含服务协定和服务实现。如果客户端应用只使用元数据信息来创建访问服务的代理,这个模型就是可以用的。但是,如果客户端可能直接使用协定类型,则最好协定放在一个独立的程序集中,如本例所示。在第一个已完成的客户端吧中,代理是从元数据中创建的。以后将介绍如何创建客户端,来共享协定程序。把协定和实现分开,是共享协定的一个准备工作。

2.4WCF服务宿主和WCF测试客户端

WCFServiceLibrary项目模板创建了一个应用程序配置文件App.config,它需要适用于新类名和新接口名。service元素引用了包含名称空间的服务类型,协定接口需要用endpoint元素定义。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="Wrox.ProCSharp.WCF.Service.RoomReservationService">
        <endpoint address="" binding="basicHttpBinding" contract="Wrox.ProCSharp.WCF.Contracts.IRoomService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/RoomReservationService/Service1/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/></startup></configuration>

从vs2013中启动这个库,会启动WCF服务宿主,它显示为任务栏的注意区域中的一个图标。单击这个图标会打开WCF服务宿主窗口。在其中可以查看服务的状态。WCF库应用程序的项目属性包含WCF选项卡,在其中可以选择运行同一个解决方案中的项目时,是否启动WCF服务宿主。默认打开这个选项。另外在项目属性的调试配置中,会发现已定义命令行参数/client:WcfTestClient.exe。WCF服务主机使用这个选项,会启动WCF测试客户端,该测试客户端可用于测试应用程序。双击一个操作,输入字段就会显示在应以程序的右边,可以再其中填充要发送给服务器的数据。单击XML选项卡,可以看到已收发的SOAP消息。

使用WCF可以再任意宿主上运行服务。可以为对等服务创建一个Windows窗体或WPF应用程序,或创建一个Windows服务,或用Windows Activation ServiceWAS或IIS存放该服务。控制台应用程序也适用于演示简单的主机。

对于服务主机,必须引用服务库和System.ServiceModel程序集。该服务首先实例化和打开ServiveHost类型对象。这个类在System.ServiceModel命名空间中定义。实现该服务的RoomReservcationService类在构造函数中定义。调用Open方法会启动服务的监听信道,该服务准备用于侦听请求。close()方法会停止信道。下面的代码段还添加了ServiceMetadataBehavior类型的一个操作,添加该操作,就允许使用WSDL创建一个客户端应用程序。

2.8与客户端共享协定程序集

在前面的WPF客户端应用程序中,使用元数据创建了一个代理类,用vs添加了一个服务引用。客户端也可以用共享的协定程序集来创建,如夏所示。使用协定接口和ChannelFactory<TChannel>来实例化连接到服务上的通道。

类ChannelFactory<TChannel>的构造函数接受绑定配置和端点地址作为参数。绑定必须与服务宿主定义的绑定兼容,用EndPointAddress类定义的地址引用了当前运行的服务的URI。CreateChannel方法创建了一个连接到服务上的通道,接着就可以调用服务的方法了。

猜你喜欢

转载自blog.csdn.net/wudong121/article/details/80473759