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);
            }
        }
    }
    View Code

    在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>
    View Code

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

    进入我们的.net安装目录,我这个是安装的4.0,所以进入C:WindowsMicrosoft.NETFramework64v4.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

    博客地址:一天两天三天

    转载请以超链接形式标明文章原始出处。
  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/santian/p/4397235.html
Copyright © 2011-2022 走看看