基于 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.rhkb.cn/news/444240.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十、kotlin的协程

协程 基本概念定义组成挂起和恢复结构化并发协程构建器作用域构建器挂起函数阻塞与非阻塞runBlocking全局协程像守护线程 Job的生命周期 常用函数延时和等待启动和取消启动取消 暂停 协程启动调度器启动方式启动模式线程上下文继承的定义继承的公式 协程取消与超时取消挂起点取…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

电磁兼容系列

1.1 电磁兼容基本概念 “电磁兼容是研究在有限空间、时间、频谱资源条件下&#xff0c;各种用电设备&#xff08;广义的还包括生物体&#xff09;可以共存&#xff0c;并不致引起降级的一门学科。“ 研究频率范围&#xff1a;0Hz~400GHz&#xff08;CISRP 24&#xff09;&…

vite学习教程05、vite+vue2构建本地 SVG 图标

文章目录 前言一、构建本地SVG图标详细步骤1、安装开发依赖2、配置vite2.1、配置vite.config.js2.2、封装vite引入插件脚本 解决报错&#xff1a;can not find package fast-glob imported 二、实际应用应用1&#xff1a;未封装&#xff0c;直接vue应用应用2&#xff1a;封装vu…

RTSP 音视频play同步分析

基础理论 RTSP RTP RTCP SDP基础知识-CSDN博客 关于RTP的时间戳知识点回顾 时间戳单位&#xff1a;时间戳计算的单位不是秒&#xff0c;而是采用采样频率的倒数&#xff0c;这样做的目的是为了使时间戳单位更为精准。比如说一个音频的采样频率为8000Hz&#xff0c;那么我们可…

J1学习打卡

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 # 数据预处理和加载 import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, …

5.C语言基础入门:数据类型、变量声明与创建详解

C语言基础入门&#xff1a;数据类型、变量声明与创建详解 C语言往期系列文章目录 往期回顾&#xff1a; C语言是什么&#xff1f;编程界的‘常青树’&#xff0c;它的辉煌你不可不知VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】&#xff0c;3.4k stars - WiFi 网络分析工具二、【penpot】&#xff0c;33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】&#xff0c;6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …

leetcode hot100_part3_滑动窗口

滑动窗口是有一个基本的模版的&#xff0c;不要自己想当然哦~ 滑动窗口算法思想&#xff08;附经典例题&#xff09;_滑动窗口的思想-CSDN博客 滑动窗口也叫同向双指针&#xff1b;可以先看一下灵山视频&#xff1a;滑动窗口【基础算法精讲 03】_哔哩哔哩_bilibili 3.无重复字…

7.C++面向对象3(拷贝构造函数,赋值运算符重载)

⭐本篇为C学习第7章&#xff0c;主要了解 拷贝构造函数&#xff0c;赋值运算符重载 ⭐本人Gitee C代码仓库&#xff1a;yzc的c学习: 小川c的学习记录 - Gitee.com 上篇讲了6个默认成员函数的构造函数和析构函数。 重要代码如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS…

Mysql(五) --- 数据库设计

文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…

Pr:视频效果快速参考(合集 · 2024版)

Premiere Pro 自带十七组约一百多个视频效果&#xff0c;涵盖了从变换、颜色控制到风格化等多种用途&#xff0c;帮助用户在视频编辑中实现多样化的视觉表现、进行后期处理以及修正各种画质问题。 提示&#xff1a; 点击下面的效果组名称或截图&#xff0c;即可访问该组里面的效…

SF6气体密度监测仪市场研究:主要企业的市场份额已超过37.13%

SF6气体密度监测仪是一种专用于监测和测量六氟化硫&#xff08;SF6&#xff09;气体密度的设备。SF6气体因其优异的绝缘性能和灭弧能力&#xff0c;被广泛应用于电力行业&#xff0c;尤其是在气体绝缘金属封闭开关设备&#xff08;GIS&#xff09;和断路器等关键设备中。随着电…

【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;序列到序列&#xff08;seq2seq&#xff09;模型和Transformer架构的出现&#xff0c;极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络&#xff08;RNN&…

微服务Sleuth解析部署使用全流程

目录 1、Sleuth链路追踪 1、添加依赖 2、修改日志配置文件 3、测试 2、zipkin可视化界面 1、docker安装 2、添加依赖 3、修改配置文件 4、查看页面 5、ribbon配置 1、Sleuth链路追踪 sleuth是链路追踪框架&#xff0c;用于在微服务架构下开发&#xff0c;各个微服务之…

刷题 - 分治

面试经典 150 题 - 分治 148. 排序链表⭐️⭐️⭐️ - 快慢指针找中间节点 - 归并排序 伪代码&#xff1a; 将链表拆分成两半&#xff0c;返回右半边头节点&#xff08;左半边头节点就是原始链表头节点&#xff09;对左边进行排序并返回左边头节点对右边进行排序返回右边头节…

使用jenkins将airflow-dbt部署到服务器上

系列文章目录 文章目录 系列文章目录课程地址YT一、jenkins服务器的初始化配置1.1 运行第一个jenkins pipeline二、编写本地dbt项目2.1 克隆git上的初始文件到本地2.2 本地创建虚拟环境2.3 创建airflow的Dockerfile2.4 安装dbt2.5 创建dbt所需要的snowflake数据库2.6 配置docke…

Android开发视频预览效果

Android开发视频预览效果 视频播放不是一个简单的事情&#xff0c;得有暂停&#xff0c;继续播放等功能&#xff0c;屏幕的适配也是头疼的事情 一、思路&#xff1a; 引用的是腾讯播放器TXVodPlayer 二、效果图&#xff1a; 图片不是很直观&#xff0c;也可以看下视频 And…

渗透测试 之 域渗透手法【域内用户枚举】手法 Kerbrute msf pyKerbrute 工具使用详解

说明一下: 域内用户枚举工具使用说说&#xff1a; Kerbrute pyKerbrute MSF模块的使用 域内用户名枚举原理分析&#xff1a; 域内用户枚举攻击防御&#xff1a; 流量检测&#xff1a; 日志层面&#xff1a; 说明一下: 域环境或者内网环境下&#xff0c;可以在没有域环…