zoukankan      html  css  js  c++  java
  • WCF服务寄宿IIS与Windows服务

      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

  • 相关阅读:
    SQL Server数据库高级进阶之事务实战演练
    ASP.NET Core使用Nginx搭建高可用分布式Web集群
    C#签名算法HS256和RS256实战演练
    ASP.NET (Core)WebApi参数传递实操演练
    基于Windows服务实现的亚马逊云S3文件上传
    ASP.NET Core WebApi如何动态生成树形Json格式数据
    SQL Server数据库高级进阶之分布式唯一ID生成实战演练
    ASP.NET Core WebApi分布式文件系统FastDFS实战演练
    .Net Core使用NLog记录日志到文件和数据库实战演练
    ASP.NET Core开源任务调度框架Hangfire实战演练
  • 原文地址:https://www.cnblogs.com/qq260250932/p/5324268.html
Copyright © 2011-2022 走看看