zoukankan      html  css  js  c++  java
  • WCF学习之旅—WCF寄宿前的准备(八)

    一、WCF服务应用程序与WCF服务库

      我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”。

         WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类协定的定义,可以直接看到运行的效果。

         WCF服务库,可以认为是一个包含WCF服务以及协定定义的类库。不能直接运行,你可以在其他项目里引用,在宿主里启用托管这个库,有点类似于我们在Web/windows项目中应用的类库。考虑WCF服务设计的时候,服务类的定义为单独的库,可以为其它项目使用。提高代码的复用性。

      当然你也可以修改这些代码,比如把WCF服务程序里的类,移到一个单独的类库里,或是把类库里的类移到WCF服务程序中。

    二、寄宿概述

      通过前面的介绍我们知道,WCF在运行时必寄宿在“宿主程序”之上,WCF本身不能够独自运行(每个WCF服务必须宿主在一个Windows进程中)。.net 提供了多种宿主供WCF运行,WCF还是非常灵活的。

     

         WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation Services,Windows进程激活服务)或IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。

    三、创建WCF服务库为多种寄宿做准备

    1) 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序。在弹出界面的“名称”对应的文本框中输入“WcfServiceLib”,然后点击“确定”按钮。如下图。

     

    2) 把Visual Studio 2015自动生成的两个文件(IService1.cs、Service1.cs)删除。

    3)  鼠标右键查看项目属性。如下图所示。

     

    4) 查看WcfServiceLib项目的引用,我们会发现“WCF类库项目”与我们平时建立的 “类库项目”都是类库,只不过多了WCF的类库项目在新建时多了两个dll的引用(System.ServiceModel.dll、 System.Runtime.Serialization.dll)和一个自动生成的配置文件(该配置文件只用于调试时使用,在WCF寄宿以后会应用宿 主的配置文件与其他应用程序通信)。如下图。

     

     

    5) 服务端我们还和第一个教程一样(IBookService接口与BookSservice实现),创建IBookService接口。代码如下。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace WcfServiceLib
    {
    
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBookService”。
    
        [ServiceContract]
        public interface IBookService
        {
            [OperationContract]
            string GetBook(string Id);
        }
    }

    6) 实现IBookService接口,代码如下。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text; 
    
    namespace WcfServiceLib
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookService”。
    
        // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookService.svc 或 BookService.svc.cs,然后开始调试。
        public class BookService : IBookService
        {
    
            public string GetBook(string Id)
            {
    
                int bookId = Convert.ToInt32(Id);
                Books book = SetBook(bookId);
                string xml = XMLHelper.ToXML<Books>(book);
                return xml;
    
            }
    
            public Books SetBook(int Id)
            {
                Books book = new Books();
                book.BookID = Id;
                book.AuthorID = 1;
                book.Category = "IBM";
                book.Price = 39.99M;
                book.Numberofcopies = 25;
                book.Name = "DB2数据库性能调整和优";
                book.PublishDate = new DateTime(2015, 2, 23);
                return book;
    
            }
        }
    }

    7) 由于Visual Studio 2015默认生成的app.config中的配置信息是以IService来写的配置,现在的为IBookService,所以配置文件有三处要修改.修改。如下图。

     

    修改后的配置文件。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- 部署服务库项目时,必须将配置文件的内容添加到
     主机的 app.config 文件中。System.Configuration 不支持库的配置文件。 -->
    
      <system.serviceModel>
        <services>
          <service name="WcfServiceLib.BookService">
            <host>
              <baseAddresses>
                <add baseAddress = "http://127.0.0.1:8888/WcfServiceLib/BookService/" />
              </baseAddresses>
            </host>
            <!-- Service Endpoints -->
            <!-- 除非完全限定,否则地址相对于上面提供的基址-->
            <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLib.IBookService">
              <!--
                  部署时,应删除或替换下列标识元素,以反映
                 用来运行所部署服务的标识。删除之后,WCF 将
                  自动推断相应标识。
              -->
              <identity>
                <dns value="localhost"/>
              </identity>
            </endpoint>
            <!-- Metadata Endpoints -->
            <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
            <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- 为避免泄漏元数据信息,
              请在部署前将以下值设置为 false -->
              <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
              <!-- 要接收故障异常详细信息以进行调试,
              请将以下值设置为 true。在部署前设置为 false
              以避免泄漏异常信息 -->
              <serviceDebug includeExceptionDetailInFaults="False" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel> 
    
    </configuration>

     8) 在Visual Studio 2015中点击“F5“运行程序。效果如下图所示,则说明成功。

     

    9) 使用鼠标左键,双击GetBook方法,在ID值中输入5,如下图。

     

    10) 在输入完ID值之后,点击,调用按钮,如下图。在出现的提示信息框中点击“确定”按钮。

     

    11) 调用成功的结果。如下图。

     

  • 相关阅读:
    显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
    安装cuda之后没有安装nvidia显卡驱动可能会出现ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
    ubuntu安装
    老男孩Linux查看硬盘使用个情况及其挂载点
    Anaconda使用conda activate激活环境出错CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
    Linux,ubuntu设置anaconda的环境变量
    Linux 磁盘管理
    anaconda路径改变后对其中文件的修改
    Linux 文件基本属性
    川藏游记发在别处的
  • 原文地址:https://www.cnblogs.com/chillsrc/p/5465828.html
Copyright © 2011-2022 走看看