wcf系列学习5天速成——第五天 服务托管

今天是系列的终结篇,当然要分享一下wcf的托管方面的知识。

 

wcf中托管服务一般有一下四种:

 

Console寄宿:             利于开发调试,但不是生产环境中的最佳实践。

winform寄宿:             方便与用户进行交互,用户想开就开,想关就关,但如果机器重启了,不得不自己手动开一下,危险+麻烦。

IIS寄宿:                    此寄宿在实战项目中得到了广泛的应用。

                                  好处有:随系统启动和停止。

                                             iis有大量的管理策略对其进行管理。

                                            即想利用wcf的功能,还想访问asp.net的功能。

Window Service 寄宿: 这个寄宿在实战中也是广泛运用的,同时也是随系统开启或者停止。

 

好了,前两种寄宿相信大家都会,在这里我就不介绍了,我主要介绍后两种寄宿。

 

IIS寄宿:  首先要知道寄宿于iis的3个条件:  应用程序域(相当于serviceHost)+svc文件+config的配置节

             

             很感谢vs模板,里面已经包含用于寄宿于iis的模板,ok,上图:

wcf系列学习5天速成——第五天 服务托管

 下面的流程就是:

     点击确定 ——>  鼠标右击wcf服务项目——>点击“发布”——>在“发布方法”中选择“文件部署”——>在"目标位置”选择“保存位置”——>点击“发布”按钮

     

wcf系列学习5天速成——第五天 服务托管

 

然后我们打开本地的IIS,新建网站,修改端口为1111,然后点击确定按钮,截图如下:

 

wcf系列学习5天速成——第五天 服务托管

 

前面我们已经说过寄宿在iis中的三个条件,

               首先看“应用程序域”:默认新建的网站在应用程序域中的.net framework的版本是2.0,

               所以我们必须修改为4.0版本。

      截图如下:

     

wcf系列学习5天速成——第五天 服务托管

 

            然后我们看一下"svc文件": iis寄宿有一个特点就是不用指定endpoint中的是address,因为svc文件的地址就是“endpoint”的地址,

    也就是说如果我想预览则需要在url中输入此文件地址。

            然后我们看一下” http://localhost:1111/Service1.svc?wsdl"里面的元数据,发现binding是“basicHttpBinding”,也就是说如果

   想改变这个低端的binding,就必须修改三个条件中的最后的一个。

         截图如下:

         

wcf系列学习5天速成——第五天 服务托管

                       

       最后看一下“config文件”,模板给我们生成的文件代码如下:

    

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  
</configuration>


     也就是说啥也没有,要把binding改成wsHttpBinding,增加终结点即可:

     

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

wcf系列学习5天速成——第五天 服务托管

 

  最后就是客户端调用:

wcf系列学习5天速成——第五天 服务托管

 

 

window server寄宿:

     要实现window server寄宿,也很感谢vs给我们提供了“window 服务”模板。

     步骤如下:  “文件”->“新建“—>“项目”->"wcf服务库"模板—>“点击确定”—>右键服务库项目添加“新建项”—>找到"window服务"—>"点击添加"。

                     为了方便我们将“WcfServiceLibrary1”改成Console应用程序,然后新建一个Main入口。

    

wcf系列学习5天速成——第五天 服务托管

  然后我们点击上面的“单击此处切换到代码视图”按钮,进入到代码视图,

  然后我们就可以在里面的"OnStart"和“OnStop”方法中添加代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.ServiceModel;

namespace WcfServiceLibrary1
{
    partial class Service2 : ServiceBase
    {
        public Service2()
        {
            InitializeComponent();
        }

        ServiceHost host;

        protected override void OnStart(string[] args)
        {
            // TODO: 在此处添加代码以启动服务。
            host = new ServiceHost(typeof(Service1));

            host.Open();
        }

        protected override void OnStop()
        {
            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            host.Close();
        }
    }
}

然后我们在“设计界面” 点击右键,找到”添加安装程序“,点击即可。

 

wcf系列学习5天速成——第五天 服务托管

 

添加完成后会出现”servceProcessInstaller1"和“servcieInstaller1”的组件。

   右击“serviceProcessInstaller1”,打开属性窗口,修改Account为LocalSystem;

   

wcf系列学习5天速成——第五天 服务托管

 

然后 右击“servcieInstaller1”组件,打开属性窗口

        修改ServcieName为:MYServiceHost,也就是定义我的服务名。

        修改StartType为:Automatic。

        

wcf系列学习5天速成——第五天 服务托管

 

最后一步就是将exe注册到window server中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceProcess;

namespace WcfServiceLibrary1
{
   public class Program
    {
        public static void Main()
        {
            ServiceBase.Run(new Service2());
        }
    }
}


好了,现在我们可以编译项目准备安装部署了,vs给我们提供了一个InstallUtil.exe工具,

                这个工具也就是真正的把我们的exe程序送到window server中。

 

打开cmd,要做的两件事情就是正确的找到“InstallUtil.exe“ 和我们的”WcfServiceLibrary1.exe“

wcf系列学习5天速成——第五天 服务托管

 

ok,安装完成,现在做的就是测试工作。

看, 快看,我找到了我的window server 服务。

wcf系列学习5天速成——第五天 服务托管

 

开启一下服务,然后预览一下wcf的address,看看是否真的启动了。

wcf系列学习5天速成——第五天 服务托管

哈哈,真的可以了,window service 寄宿大功告成。

上一篇:算法系列15天速成——第一天 七大经典排序【上】


下一篇:强化学习快餐教程(1) - gym环境搭建