当前位置: 首页 > news >正文

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

目录

引言        

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

2. 添加WCF服务

2.1 添加服务接口和实现

2.2 添加服务配置

3. 实现Windows服务

3.1 修改Service1类

3.2 在项目中添加ServiceInstaller

4. 安装和运行Windows服务

4.1 编译项目

4.2 使用InstallUtil.exe安装服务

4.3 启动服务

5. 测试WCF服务

5.1 添加客户端应用程序

5.2 添加服务引用

5.3 调用服务

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:

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

Service1.cs:

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

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

<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 类:

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 中实现服务安装:

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),并运行以下命令以安装服务:

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 中调用服务:

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服务

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

installutil /u WcfWindowsService.exe

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


http://www.mrgr.cn/news/47090.html

相关文章:

  • 【前端】自学基础算法 -- 24.动态规划-变态青蛙蛙跳台阶
  • 前端开发:Web前端和HTML
  • Swin Transformer模型详解(附pytorch实现)
  • 【Linux】Linux基础命令(二)
  • C#,数值计算,矩阵相乘的斯特拉森(Strassen’s Matrix Multiplication)分治算法与源代码
  • 工程水印相机结合图纸,真实现场时间地点,如何使用水印相机,超简单方法只教一次!
  • 【Vue】Vue扫盲(二)指令:v-for 、v-if、v-else-if、v-else、v-show
  • 【力扣刷题实战】(顺序表)移除元素
  • 界面耻辱纪念堂--隐喻使用不当03
  • 国产长芯微LDC5791是一款单通道、20位、无缓冲电压输出DAC完全P2P替代AD5791
  • 如何提高LabVIEW编程效率
  • 2000-2023年上市公司行业异质性数据(东中西、劳动密集型、技术密集型、资本密集型、高科技重污染分组)
  • 2024年最新详解项目管理系统:让你从小白到高手的蜕变
  • vue 深拷贝和浅拷贝的区别
  • java关键字abstract(抽象)详解
  • 数据结构哈夫曼树-哈夫曼树代码构造实现(C语言)
  • VAS1800Q奇力科技线性芯片电荷泵热处理
  • 数据建模?权威指南?来就对了!!!
  • Jquery serialize()、serializeArray()、$.param()
  • 单场数字人直播爆量300万,GMV狂增80%,电商人如何玩转数字人直播?
  • AI时代的SaaS架构变革
  • 不用PS!patchwork快速解决多子图组合问题~~
  • 基于单片机的山林远程环境监测仪设计
  • C盘一红就卡顿到不行?为什么呢?
  • linux上的smb共享文件夹
  • 详解Spotbugs-maven-plugin(报告如何生成html测试报告)