基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务

目录

引言

[1. 创建一个新的Windows服务项目](#1. 创建一个新的Windows服务项目)

[2. 添加WCF服务](#2. 添加WCF服务)

[2.1 添加服务接口和实现](#2.1 添加服务接口和实现)

[2.2 添加服务配置](#2.2 添加服务配置)

[3. 实现Windows服务](#3. 实现Windows服务)

[3.1 修改Service1类](#3.1 修改Service1类)

[3.2 在项目中添加ServiceInstaller](#3.2 在项目中添加ServiceInstaller)

[4. 安装和运行Windows服务](#4. 安装和运行Windows服务)

[4.1 编译项目](#4.1 编译项目)

[4.2 使用InstallUtil.exe安装服务](#4.2 使用InstallUtil.exe安装服务)

[4.3 启动服务](#4.3 启动服务)

[5. 测试WCF服务](#5. 测试WCF服务)

[5.1 添加客户端应用程序](#5.1 添加客户端应用程序)

[5.2 添加服务引用](#5.2 添加服务引用)

[5.3 调用服务](#5.3 调用服务)

[6. 卸载Windows服务](#6. 卸载Windows服务)


引言

我们利用C#可以快速开发各种后端服务,如常见的windows服务、WCF 服务、WebService服务、WebApi等,上一篇文章介绍了简单WCF服务的实现,本文将详细讲解如何基于 C# 和 .NET Framework 4.0 将 WCF服务和宿主项目合并到同一个项目中,并将其安装为Windows服务,确保每个步骤都清晰且易于理解和掌握。

以下是详细的步骤:

1. 创建一个新的Windows服务项目

  1. 打开Visual Studio,创建一个新的项目。
  2. 选择 Windows Service 项目类型,命名为 WcfWindowsService

2. 添加WCF服务

2.1 添加服务接口和实现

在项目中添加两个类:IService1.csService1.cs

IService1.cs:

cs 复制代码
using System.ServiceModel;

namespace WcfWindowsService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
    }
}

Service1.cs:

cs 复制代码
namespace WcfWindowsService
{
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return $"You entered: {value}";
        }
    }
}
2.2 添加服务配置

在项目中添加一个 App.config 文件,并添加以下配置:

XML 复制代码
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfWindowsService.Service1">
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  contract="WcfWindowsService.IService1" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/WcfWindowsService/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

3. 实现Windows服务

3.1 修改Service1类

Service1.cs 文件中创建一个新的类 WcfService,继承自 ServiceBase 类:

cs 复制代码
using System;
using System.ServiceModel;
using System.ServiceProcess;

namespace WcfWindowsService
{
    public partial class WcfService : ServiceBase
    {
        public ServiceHost serviceHost = null;

        public WcfService()
        {
            InitializeComponent();
        }

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

            serviceHost = new ServiceHost(typeof(Service1));
            serviceHost.Open();
        }

        protected override void OnStop()
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
                serviceHost = null;
            }
        }
    }
}
3.2 在项目中添加ServiceInstaller
  1. 右键点击项目,选择 Add -> New Item
  2. 选择 Component Class,命名为 ProjectInstaller.cs

ProjectInstaller.cs 中实现服务安装:

cs 复制代码
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace WcfWindowsService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        private ServiceProcessInstaller processInstaller;
        private ServiceInstaller serviceInstaller;

        public ProjectInstaller()
        {
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller = new ServiceInstaller();

            // 设置服务使用的账号类型
            processInstaller.Account = ServiceAccount.LocalSystem;

            // 设置服务信息
            serviceInstaller.ServiceName = "WcfWindowsService";
            serviceInstaller.DisplayName = "WCF Windows Service";
            serviceInstaller.StartType = ServiceStartMode.Manual;

            Installers.Add(processInstaller);
            Installers.Add(serviceInstaller);
        }
    }
}

4. 安装和运行Windows服务

4.1 编译项目

确保项目没有错误,然后编译项目。

4.2 使用InstallUtil.exe安装服务

打开管理员权限的命令提示符,导航到编译输出目录(通常是bin\Debug或bin\Release),并运行以下命令以安装服务:

bash 复制代码
installutil WcfWindowsService.exe
4.3 启动服务
  1. 打开 Services 管理器(按下Win+R,输入 services.msc 后回车)。
  2. 找到名为 WcfWindowsService 的服务。
  3. 右键点击服务,选择 Start 启动服务。

5. 测试WCF服务

5.1 添加客户端应用程序
  1. 创建一个新的 Console Application 项目来测试服务,命名为 WcfClient
5.2 添加服务引用

在客户端项目中,右键点击项目,选择 Add Service Reference,输入服务地址(如 http://localhost:8733/Design_Time_Addresses/WcfWindowsService/Service1/),然后点击 GoOK

5.3 调用服务

在客户端的 Program.cs 中调用服务:

cs 复制代码
using System;

namespace WcfClient
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new ServiceReference1.Service1Client();
            string result = client.GetData(42);
            Console.WriteLine(result);
            client.Close();
        }
    }
}

6. 卸载Windows服务

如果不再需要服务,可以卸载:

bash 复制代码
installutil /u WcfWindowsService.exe

通过这些步骤,您可以将WCF服务和宿主项目合并到同一个项目中,并将其安装为Windows服务。这样可以实现WCF服务的长期运行,并通过Windows服务管理器来管理服务的生命周期。

相关推荐
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
yngsqq2 小时前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
TENET信条2 小时前
day53 第十一章:图论part04
开发语言·c#·图论
咸鱼桨3 小时前
《庐山派从入门到...》PWM板载蜂鸣器
人工智能·windows·python·k230·庐山派
滚雪球~4 小时前
如何使用Windows快捷键在多显示器间移动窗口
windows·计算机外设
anlog4 小时前
C#在自定义事件里传递数据
开发语言·c#·自定义事件
大猫和小黄5 小时前
Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
linux·服务器·windows·git
向宇it5 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
Schwertlilien6 小时前
图像处理-Ch6-彩色图像处理
windows
仰望大佬0076 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#