基于 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服务管理器来管理服务的生命周期。

相关推荐
派大鑫wink1 分钟前
Python 自动化办公实战:Excel 批量处理 + 邮件自动发送(附完整源码)
linux·windows·github
CreasyChan5 分钟前
Unity 中的反射使用详解
unity·c#·游戏引擎·游戏开发
奇树谦6 分钟前
WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析15
windows
Aevget6 分钟前
DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(一)?
ui·.net·wpf·devexpress·ui开发·wpf界面控件
非凡ghost13 分钟前
FlexiPDF(专业PDF编辑软件)
windows·学习·pdf·软件需求
chao18984418 分钟前
C# 实现画板源码
开发语言·c#
习惯就好zz19 分钟前
Godot GDExtension 4.5 windows编译记录
windows·godot·cpp·gdextension
zwxu_20 分钟前
日志收集方案
c#·linq
野生风长26 分钟前
从零开始的c语言:初步理解指针—从底层到入门(上)指针概念及语法,指针运算, 传地址和传值
c语言·开发语言·windows·visual studio
唐青枫38 分钟前
告别频繁 GC:C#.NET PooledList 的设计与使用场景
c#·.net