公海赌船网址会见起如下图中1底不当。会产出如下图中1之谬误。服务寄宿将服务描述通过长数据的款型披露出去。

        在高达一样篇(WCF学习的一起—实现REST服务(二十二))文章中略介绍了瞬间RestFul与WCF支持RestFul所提供的不二法门,本文讲解一下什么样创造一个支撑REST的WCF服务端程序。

 

        在上平等首(WCF学习之同—实现REST服务(二十二))文章被概括介绍了转RestFul与WCF支持RestFul所提供的道,本文讲解一下什么样创建一个支持REST的WCF服务端程序。

 

第五步:创建客户端

     
WCF应用服务被成功寄宿后,WCF服务用即开了劳动调用请求的监听工作。此外,服务寄宿将劳动描述通过长数据的形式发表出来,相应的客户端就好赢得这些元数据。接下来我们来创造客户端程序进行劳动的调用。

      1)
现在求预运行服务寄宿程序(Hosting.exe)。

      2) 在Visual Studio
2015的“解决方案资源管理器”中,把WinClient项目开展,左键选中“引用”,点击鼠标右键,弹出菜单,在弹出的上下文菜单中选择“添加服务引用(Add
Service References)”。如下图。

公海赌船网址 1

       3)
此时见面弹有一个会话框,如下图所出示。在对话框中之“地址”输入框中输入服务元数据发布之源地址:http://127.0.0.1:8888/BookService/metadata,并在“命名空间”输入框中输入一个命名空间,然后点击“确定”按钮(如下图)。Visual
studio 2015会面自动生成一多元用于服务调用的代码和布置。

公海赌船网址 2 

 添加服务引用

     4)  在Visual Studio
2015自动生成的近乎中,包含一个劳务协定接口、一个劳动代办对象与其余有关的类。被客户端直接用来服务调用的凡一个连续自
ClientBase<IBookService>并贯彻了IBookService接口的劳务代办类BookServiceClient。
如下图。

 公海赌船网址 3

    
5)BookServiceClient的切实可行落实如下图。

 公海赌船网址 4

 

      6)
我们好实例化BookServiceClient对象,执行相应措施调用WCF服务操作。客户端进行WCF服务调用的代码如下:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinClient
{
    public partial class FrmBook : Form
    {
        public FrmBook()
        {

            InitializeComponent();
        }

        private void btnGetBook_Click(object sender, EventArgs e)
        {
            BookServiceRef.Books book = new BookServiceRef.Books();
            BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient();
            textBoxMsg.Text= bookSvrClient.GetBook("3");
            book = XMLHelper.DeSerializer<BookServiceRef.Books>(textBoxMsg.Text);
            txtBookId.Text = book.BookID.ToString();
            txtAuthorID.Text = book.AuthorID.ToString();
            textBoxName.Text = book.Name;
            textBoxCategory.Text = book.Category.ToString();
            textBoxPrice.Text = book.Price.ToString();

        }

    }

}

 

运转后底结果,如下图。

 公海赌船网址 5

四、在WCF中创建REST服务

  1. 每当SCF.Contracts
    在创立一个劳动契约IBookRestService.

      
这里提供个别独艺术,分别使用GET和POST方式访问。

      
我们得望,与日常WCF服务契约不同的凡,需要额外用WebGet或者WebInvoke指定REST访问的措施。另外还要指定消息包装样式与消息格式,默认的信请求与应格式为XML,若选择JSON需要显式声明。 

       
UriTemplate用来拿计映射到具体的Uri上,但如果不点名映射,将投到默认的Uri。比如动用Get访问的GetBook方法,默认投是:/
GetBook?BookId={BookId}。

        
在编排代码的历程遭到,会并发如下图被1的荒唐,请引用下图2处在之

         
公海赌船网址 6

 

using SCF.Model;

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Threading.Tasks; 

namespace SCF.Contracts
{

    [DataContractFormat]
    [ServiceContract]
    public interface IBookRestService
    {

        //[WebGet(UriTemplate = "/Books/Get/{BookId}/{categroy}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
        [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
          [OperationContract]
          List<Books> GetBook(string BookId);

        //[WebInvoke(Method = "POST", UriTemplate = "/Books/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
        [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
         [OperationContract]
         Result AddBook(Books book);

     }


}

 

 

     2.
每当项目SCF.Model中创造一个实体对象Books与一个返对象Result,用作多少传的载体,下面是Books.cs的情

namespace SCF.Model
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
using System.Runtime.Serialization;
 ///DataContract 数据契约:服务端和客户端之间要传送的自定义数据类型  
    [DataContract(Namespace = "http://tempuri.org/")]
    public partial class Books

{

 /// <summary>  
/// 在数据传送过程中,只有成员变量可以被传送而成员方法不可以。  
/// 并且只有当成员变量加上DataMember时才可以被序列进行数据传输,  
/// 如果不加DataMember,客户端将无法获得该属性的任何信息  
/// </summary>  

        [DataMember]
        [Key]
        public int BookID { get; set; }

        [DataMember]
        [Required]
        public string Category { get; set; }

        [DataMember]
        [Required]
        public string Name { get; set; }

        [DataMember]
        public int Numberofcopies { get; set; }

        [DataMember]
        public int AuthorID { get; set; }

        [DataMember]
        public decimal Price { get; set; }
        [DataMember]
        public DateTime PublishDate { get; set; }

        [StringLength(5)]
        [DataMember]
        public string Rating { get; set; }
    }

}










using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;


namespace SCF.Model
{

    [DataContract(Namespace = "http://tempuri.org/")]
    public class Result
    {

        [DataMember]
        public string Message
        { get; set; }
    }

}

 

 

     3.
每当SCF.WcfService项目被贯彻以SCF.Contracts项目中定义的劳动契约。此处最简便易行的落实GetBook和AddBook两单方法的逻辑。

using SCF.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using SCF.Model;
using SCF.Common;


namespace SCF.WcfService
{

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookRestService”。
    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookRestService.svc 或 BookRestService.svc.cs,然后开始调试。
    public class BookRestService : IBookRestService
    { 

        Entities db = new Entities();
        public Result AddBook(Books book)
        {

            Result result = new Result();
            try
            {               

                db.Books.Add(book);
                db.SaveChanges();
                result.Message = string.Format("书名:{0} 已经添加!",book.Name);


            }
            catch (Exception ex)
            {
                result.Message =ex.Message;
            }

            return result;
        }



        public List<Books> GetBook(string BookId)
        {

            var cateLst = new List<string>();

            var cateQry = from d in db.Books
                          orderby d.Category
                          select d.Category;
            cateLst.AddRange(cateQry.Distinct()); 

            var books = from m in db.Books
                        select m;


            if (!String.IsNullOrEmpty(BookId))
            {
                books = books.Where(s => s.Name.Contains(BookId));
            }

            List<Books> list = null;
              list = books.ToList<Books>();
            return list;        

        } 

    }
}

 

  

   

4.
当布置文件于受配备我们的Rest服务,必须用WebHttpBehavior对劳务之终结点进行安排。

 

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, 
Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>

  </entityFramework> 

  <system.serviceModel>  

    <bindings>
       <webHttpBinding>
         <binding name="RestWebBinding">
         </binding>
       </webHttpBinding>
     </bindings>


    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">

          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>

          <behavior name="RestServiceBehavior">
         </behavior>
      </serviceBehaviors>
       <endpointBehaviors>
         <behavior name="RestWebBehavior">
           <!--这里必须设置-->
           <webHttp />
         </behavior>
       </endpointBehaviors> 

    </behaviors> 

    <services>
      <service behaviorConfiguration="metadataBehavior" name="SCF.WcfService.BookService">
        <endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"
        contract="SCF.Contracts.IBookService" />
      </service>

      <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
         <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
                   binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
         </endpoint>
       </service>



    </services>
  </system.serviceModel> 

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <connectionStrings>


    <add name="Entities" connectionString="metadata=res://*/BookModel.csdl|res://*/BookModel.ssdl|res://*/BookModel.msl;
provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=Test;
integrated security=SSPI;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings> 

</configuration>

 

四、在WCF中创建REST服务

  1. 于SCF.Contracts
    在创建一个劳务契约IBookRestService.

      
这里提供个别只方法,分别下GET和POST方式访问。

      
我们可见到,与普通WCF服务契约不同的凡,需要额外用WebGet或者WebInvoke指定REST访问的办法。另外还要指定消息包装样式与信息格式,默认的消息请求与应格式为XML,若选择JSON需要显式声明。 

       
UriTemplate用来拿艺术映射到实际的Uri上,但要是不点名映射,将投到默认的Uri。比如利用Get访问的GetBook方法,默认投是:/
GetBook?BookId={BookId}。

        
在编制代码的过程遭到,会出现如下图中1之荒谬,请引用下图2介乎之

         
公海赌船网址 7

 

using SCF.Model;

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Threading.Tasks; 

namespace SCF.Contracts
{

    [DataContractFormat]
    [ServiceContract]
    public interface IBookRestService
    {

        //[WebGet(UriTemplate = "/Books/Get/{BookId}/{categroy}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
        [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
          [OperationContract]
          List<Books> GetBook(string BookId);

        //[WebInvoke(Method = "POST", UriTemplate = "/Books/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
        [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
         [OperationContract]
         Result AddBook(Books book);

     }


}

 

 

     2.
于档次SCF.Model中创造一个实体对象Books与一个回到对象Result,用作多少传的载体,下面是Books.cs的情节

namespace SCF.Model
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
using System.Runtime.Serialization;
 ///DataContract 数据契约:服务端和客户端之间要传送的自定义数据类型  
    [DataContract(Namespace = "http://tempuri.org/")]
    public partial class Books

{

 /// <summary>  
/// 在数据传送过程中,只有成员变量可以被传送而成员方法不可以。  
/// 并且只有当成员变量加上DataMember时才可以被序列进行数据传输,  
/// 如果不加DataMember,客户端将无法获得该属性的任何信息  
/// </summary>  

        [DataMember]
        [Key]
        public int BookID { get; set; }

        [DataMember]
        [Required]
        public string Category { get; set; }

        [DataMember]
        [Required]
        public string Name { get; set; }

        [DataMember]
        public int Numberofcopies { get; set; }

        [DataMember]
        public int AuthorID { get; set; }

        [DataMember]
        public decimal Price { get; set; }
        [DataMember]
        public DateTime PublishDate { get; set; }

        [StringLength(5)]
        [DataMember]
        public string Rating { get; set; }
    }

}










using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;


namespace SCF.Model
{

    [DataContract(Namespace = "http://tempuri.org/")]
    public class Result
    {

        [DataMember]
        public string Message
        { get; set; }
    }

}

 

 

     3.
于SCF.WcfService项目遭到落实以SCF.Contracts项目受到定义的劳动契约。此地最简便易行的落实GetBook和AddBook两个办法的逻辑。

using SCF.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using SCF.Model;
using SCF.Common;


namespace SCF.WcfService
{

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookRestService”。
    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookRestService.svc 或 BookRestService.svc.cs,然后开始调试。
    public class BookRestService : IBookRestService
    { 

        Entities db = new Entities();
        public Result AddBook(Books book)
        {

            Result result = new Result();
            try
            {               

                db.Books.Add(book);
                db.SaveChanges();
                result.Message = string.Format("书名:{0} 已经添加!",book.Name);


            }
            catch (Exception ex)
            {
                result.Message =ex.Message;
            }

            return result;
        }



        public List<Books> GetBook(string BookId)
        {

            var cateLst = new List<string>();

            var cateQry = from d in db.Books
                          orderby d.Category
                          select d.Category;
            cateLst.AddRange(cateQry.Distinct()); 

            var books = from m in db.Books
                        select m;


            if (!String.IsNullOrEmpty(BookId))
            {
                books = books.Where(s => s.Name.Contains(BookId));
            }

            List<Books> list = null;
              list = books.ToList<Books>();
            return list;        

        } 

    }
}

 

  

   

4.
当部署文件在饱受布局我们的Rest服务,必须使WebHttpBehavior对劳动之终结点进行配置。

 

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, 
Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>

  </entityFramework> 

  <system.serviceModel>  

    <bindings>
       <webHttpBinding>
         <binding name="RestWebBinding">
         </binding>
       </webHttpBinding>
     </bindings>


    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">

          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>

          <behavior name="RestServiceBehavior">
         </behavior>
      </serviceBehaviors>
       <endpointBehaviors>
         <behavior name="RestWebBehavior">
           <!--这里必须设置-->
           <webHttp />
         </behavior>
       </endpointBehaviors> 

    </behaviors> 

    <services>
      <service behaviorConfiguration="metadataBehavior" name="SCF.WcfService.BookService">
        <endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"
        contract="SCF.Contracts.IBookService" />
      </service>

      <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
         <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
                   binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
         </endpoint>
       </service>



    </services>
  </system.serviceModel> 

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <connectionStrings>


    <add name="Entities" connectionString="metadata=res://*/BookModel.csdl|res://*/BookModel.ssdl|res://*/BookModel.msl;
provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=Test;
integrated security=SSPI;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings> 

</configuration>

 

第六步:客户端通过ChannelFactory<T>方式调用WCF服务

     
客户端通过服务代办对象进行劳动的调用,上面的事例通过创办自动生成的继续自ClientBase<T>的类型对象进行劳动调用。实际上,我们尚具备另外一栽创建服务代办的方法,就是经过ChannelFactory<T>。此外,WCF采用基于协定的劳动调用方法,从点的例子我们也足以看,Visual
Studio
2015在进展服务引用添加的经过中,会以客户端创建一个与服务端等效的劳动协定接口。在咱们的例证中,由于服务端和客户端都是在和一个化解方案面临,完全可叫服务端和客户端引用相同之签订。

       1) 
为了实现通过ChannelFactory<T>调用WCF服务之效益,我们要添加一个新的类型,命名吧SCF.Contracts,把原在SCF.
WcfService项目遭到之IBookService.cs文件移到SCF.Contracts项目受到,同时转命名空间。SCF.
WcfService与WinClient项目还要添加对SCF.Contracts项目之援。最后的类组织要下图。

 公海赌船网址 8

       2) 
我们将经过为这SCF.Contracts项目面临的IBookService服务协定接口,使用
ChannelFactory<IBookService>创建服务代办对象,直接开展对应的劳务调用。我们事先实现普当代码中贯彻基于
ChannelFacotory<T>进行服务代办的创导和劳动调用的法子。代码如下:

private void buttonChannelFactory_Click(object sender, EventArgs e)

        {

            using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>

                (new WSHttpBinding(), "http://127.0.0.1:8888/BookService"))

            {

                IBookService proxy = channelFactory.CreateChannel();
                using (proxy as IDisposable)

                {
                    textBoxMsg.Text = proxy.GetBook("4");
                    Books book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text);
                    txtBookId.Text = book.BookID.ToString();
                    txtAuthorID.Text = book.AuthorID.ToString();
                    textBoxName.Text = book.Name;
                    textBoxCategory.Text = book.Category.ToString();
                    textBoxPrice.Text = book.Price.ToString();
                }

            }

            }

 

        3) 
点击“ChannelFactory方式”按钮之后,结果使下图。

 公海赌船网址 9

       4) 
由于终结点是WCF进行通信的绝无仅有手段,ChannelFactory<T>本质上是通过点名的终结点创建用于进行服务调用的劳务代办。在上面的代码中,在开立ChannelFactory<T>的时候更于构造函数中指定终结点的连锁因素(协定通过范型类型表示,地址及绑定则通过参数指定)。上面这种直白当代码中写相应地点和绑定的艺术,对于后期的护不便宜。在事实上的WCF应用被,一般以布局文件中形容地址及绑定,然后通过读取配置文件之主意来促成服务调用。我们以app.config配置文件被布置指定终结点的三要素,并也对应的终结点指定一个终结点配置名称(BookService)。配置信息如下:

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

<configuration>

    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IBookService" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IBookService" contract="SCF.Contracts.IBookService"
                name="WSHttpBinding_IBookService">
                <identity>
                    <userPrincipalName value="DEVELOPER\Administrator" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>

</configuration>

 

 

        5) 
接下我们由此配备信息来创造ChannelFactory<T>对象,此时不要再指定终结点的绑定和地方了,而一味须制定相应的终结点配置名称。代码如下。

 

  private void buttonChannelConfig_Click(object sender, EventArgs e)

        {

            using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService"))

            {

                IBookService proxy = channelFactory.CreateChannel();

                using (proxy as IDisposable)

                {

                    textBoxMsg.Text = proxy.GetBook("5");

                    Books book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text);

                    txtBookId.Text = book.BookID.ToString();

                    txtAuthorID.Text = book.AuthorID.ToString();

                    textBoxName.Text = book.Name;

                    textBoxCategory.Text = book.Category.ToString();

                    textBoxPrice.Text = book.Price.ToString();

                }

            }

        }

 

        6)
点击“ChannelFactorys配置方式”按钮之后,结果一旦下图。

 公海赌船网址 10

 

 

注:
我以编排这示例项目的进程遭到碰到了以下问题:

WCF由于目标电脑积极拒绝,无法连接错误

不当描述:新建的WCF类库项目,由WinForm程序托管,托管的时光从不错误,但是当客户端引用服务之上,却找不交服务,而且
如果打开多独服务呢未会见报端口占用错误。

解决思路:

1)检查部署文件,看安排信息是否刻画的正确性,不行

2)重开电脑,不行

3)把安排方式改变成为了直接代码方式,不行

4)不寄宿WCF服务的情状下引用服务,提示一样的谬误。我打开监听端口仔细摸,没有找到自己定义之8888端口。看来WCF服务寄宿没有成功,如果寄宿成功,端口肯定是在监听状态。

解决办法:首先去掉using,然后再尝试,引用服务成功,调用也成。原来当以using时,如果using被放出,则host会被using关闭,所以服务打开后,然后便马上被关闭了。请密切察看下两截代码的分别。

错误代码:

 

 static void Main(string[] args)
        {
            try
            {
                using (ServiceHost host = new ServiceHost(typeof(BookService)))
                {
                    host.Opened += delegate
                    {
                        Console.WriteLine("BookService,使用配置文件,按任意键终止服务!");
                    };
                    host.Open();
                                   }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }

 

正确代码:

static void Main(string[] args)
        {
            try
            {
                using (ServiceHost host = new ServiceHost(typeof(BookService)))
                {
                    host.Opened += delegate
                    {
                        Console.WriteLine("BookService,使用配置文件,按任意键终止服务!");
                    };
                    host.Open();
Console.Read();
                                   }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

 

相关文章