WCF服务寄宿IIS与Windows服务 - C#/.NET

  WCF是Windows平台下程序间通讯的应用程序框架。整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择。wcf程序的运行需要一个宿主ServiceHost,我们可以选用控制台应用程序,也可以选择IIS寄宿,还可以选择windows 服务寄宿。相较与控制台程序,IIS,和Windows服务比较稳定。而且大家不会时不时的去重启下IIS下的网站,或者windows服务。

在IIS下寄宿Wcf

我们新建一个类库项目

在项目下添加一个ICalculator接口类,实现wcf 服务契约,操作契约接口

using System.ServiceModel;
namespace IISServices
{
    [ServiceContract(Name = 'CalculatorService')]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double x, double y);

        [OperationContract]
        double Subtract(double x, double y);

        [OperationContract]
        double Multiply(double x, double y);

        [OperationContract]
        double Divide(double x, double y);
    }
}

新建一个服务类CalculatorService,实现服务契约接口ICalculator

namespace IISServices
{
    public class CalculatorService : ICalculator
    {
        public double Add(double x, double y)
        {
            return x + y;
        }

        public double Subtract(double x, double y)
        {
            return x - y;
        }

        public double Multiply(double x, double y)
        {
            return x * y;
        }

        public double Divide(double x, double y)
        {
            return x / y;
        }
    }
}

添加一个文件,文件名为CalculatorService.svc就是我们用来寻找服务对外暴漏的入口。只需要添加一行代码就可以。当我们访问服务的时候IIS会寻找我们这个svc文件来找到我们提供的服务。

 <%@ServiceHost Service='IISServices.CalculatorService'%>

添加一个web.Config文件,添加system.serviceModel节点的配置信息。里面不需要配置我们访问服务的地址,因为IIS下我们网站的地址就是我们访问服务的地址。

<?xml version='1.0' encoding='utf-8' ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name='metadataBehavior'>
          <serviceMetadata httpGetEnabled='true'/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration='metadataBehavior' name='IISServices.CalculatorService'>
        <endpoint  binding='wsHttpBinding' contract='IISServices.ICalculator' />
      </service>
    </services>
  </system.serviceModel>
</configuration>

项目详细如下,另外应用里面需要添加System.ServiceModel这个dll引用,wcf的大部分实现都在这个类库里面:

\

我们在IIS下面新建一个网站,根目录只需要添加web.Config,svc服务文件即可,bin下面放我们生成的IISServices.dll如下:

\

网站访问端口我们配置为82,启动网站。

在我们需要引用服务的类库或exe上添加服务引用http://localhost:82/CalculatorService.svc,就可以找到我们需要的服务了。

\

在Windows服务下寄宿wcf服务

我们新建一个控制台应用程序Service。添加下面这三个类库引用

System.ServiceModel.dll

System.ServiceProcess.dll

System.Configuration.Install.dll

将Programs.cs修改为Service.cs,添加代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ServiceModel;
using System.ServiceProcess;
using System.Configuration;
using System.Configuration.Install;

namespace Microsoft.ServiceModel.Samples
{
    // Define a service contract.
    [ServiceContract(Namespace = 'http://Microsoft.ServiceModel.Samples')]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

    // Implement the ICalculator service contract in a service class.
    public class CalculatorService : ICalculator
    {
        // Implement the ICalculator methods.
        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            return result;
        }
    }

    public class CalculatorWindowsService : ServiceBase
    {
        public ServiceHost serviceHost = null;
        public CalculatorWindowsService()
        {
            // Name the Windows Service
            ServiceName = 'WCFWindowsServiceSample';
        }

        public static void Main()
        {
            ServiceBase.Run(new CalculatorWindowsService());
        }

        // Start the Windows service.
        protected override void OnStart(string[] args)
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
            }

            // Create a ServiceHost for the CalculatorService type and 
            // provide the base address.
            serviceHost = new ServiceHost(typeof(CalculatorService));

            // Open the ServiceHostBase to create listeners and start 
            // listening for messages.
            serviceHost.Open();
        }

        protected override void OnStop()
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
                serviceHost = null;
            }
        }
    }

    // Provide the ProjectInstaller class which allows 
    // the service to be installed by the Installutil.exe tool
    [RunInstaller(true)]
    public class ProjectInstaller : Installer
    {
        private ServiceProcessInstaller process;
        private ServiceInstaller service;

        public ProjectInstaller()
        {
            process = new ServiceProcessInstaller();
            process.Account = ServiceAccount.LocalSystem;
            service = new ServiceInstaller();
            service.ServiceName = 'WCFWindowsServiceSample';
            Installers.Add(process);
            Installers.Add(service);
        }
    }
}

在App.Config里面添加配置节点ServiceModel如下:

 <system.serviceModel>
    <services>
      <!-- This section is optional with the new configuration model
           introduced in .NET Framework 4. -->
      <service name='Microsoft.ServiceModel.Samples.CalculatorService'
               behaviorConfiguration='CalculatorServiceBehavior'>
        <host>
          <baseAddresses>
            <add baseAddress='http://localhost:8000/ServiceModelSamples/service'/>
          </baseAddresses>
        </host>
        <!-- this endpoint is exposed at the base address provided by host: http://localhost:8000/ServiceModelSamples/service  -->
        <endpoint address=''
                  binding='wsHttpBinding'
                  contract='Microsoft.ServiceModel.Samples.ICalculator' />
        <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex -->
        <endpoint address='mex'
                  binding='mexHttpBinding'
                  contract='IMetadataExchange' />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name='CalculatorServiceBehavior'>
          <serviceMetadata httpGetEnabled='true'/>
          <serviceDebug includeExceptionDetailInFaults='False'/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

生成文件,注意看程序的入口main函数ServiceBase.Run(new CalculatorWindowsService());在main函数里面程序调用了windows服务。我们这个项目本质上是一个windows服务。windows服务不可以直接运行,需要先安装。我们使用管理员身份打开cmd.exe

进入我们的.net安装目录,我这个是安装的4.0,所以进入C:WindowsMicrosoft.NETFramework64 4.0.30319文件夹,找到该文件夹下面的InstallUtil.exe程序。在cmd里面输入如下,回车

\

进入.net安装文件夹,输入InstallUtil.exe '生成服务所在的路径',注意这儿最好给路径加上引号,没有引号如果碰到空格可能报错。

\

安装后如果出现下面的successfully,说明服务安装完成。

\

然后我们到windows服务里面启动该服务。

\

启动服务后,在需要引用该服务的类库或者exe程序上添加服务引用,路径为我们App.config里面的 <add baseAddress='http://localhost:8000/ServiceModelSamples/service'/>基地址

\

点击转到,出现CalculatorService说明我们配置成功。

注:

安装 Windows 服务: installutil binservice.exe 

卸载Windows服务: installutil /u binservice.exe 或者 sc delete 服务名

启动Windows服务: net start WCFWindowsServiceSample

停止Windows服务: type net stop WCFWindowsServiceSample

windows服务的寄宿,参考msdn:https://msdn.microsoft.com/zh-cn/library/ms733069.aspx

本文地址:http://www.cnblogs.com/santian/p/4397235.html

posted @ 2016-03-26 22:11  qq260250932  阅读(325)  评论(0编辑  收藏  举报