Windows服务的制作、安装可以参考这篇:

C#.NET 操作Windows服务(安装、卸载) - runliuv - 博客园 (cnblogs.com)

本篇会在这个解决方案基础上,继续修改。

一、制作WCF

我们在原有解决方案上添加一个“WCF 服务库”,为名“WcfYeah”。

在WcfYeah中额外引用System.ServiceModel.Web.dll程序集。

修改IService1.cs:

using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WcfYeah
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
CompositeType geta(CompositeType composite);
} // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
// 可以将 XSD 文件添加到项目中。在生成项目后,可以通过命名空间“WcfYeah.ContractType”直接使用其中定义的数据类型。
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello "; [DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
} [DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
}

修改Service1.cs:

using System;
using System.ServiceModel; namespace WcfYeah
{
// 调整 ServiceBehavior,使其支持并发
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall, UseSynchronizationContext = false)]
public class Service1 : IService1
{
public CompositeType geta(CompositeType composite)
{
CompositeType myret = new CompositeType();
try
{
if(composite==null)
myret.StringValue = "[0]输入实体为空:" + DateTime.Now.ToString();
else
myret.StringValue = "[1]输入实体不为空:" + DateTime.Now.ToString();
}
catch (Exception ex)
{
myret.StringValue = "发生异常:" + ex.Message;
}
return myret;
} }
}

增加一个WCFServer.cs:

using System.Net;
using System.ServiceModel.Web;
using System.Threading; namespace WcfYeah
{
public class WCFServer
{
public WebServiceHost host = null; public WCFServer()
{
#region 优化调整
//对外连接数,根据实际情况加大
if (ServicePointManager.DefaultConnectionLimit < 100)
System.Net.ServicePointManager.DefaultConnectionLimit = 100; int workerThreads;//工作线程数
int completePortsThreads; //异步I/O 线程数
ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads); int blogCnt = 100;
if (workerThreads < blogCnt)
{
// MinThreads 值不要超过 (max_thread /2 ),否则会不生效。要不然就同时加大max_thread
ThreadPool.SetMinThreads(blogCnt, blogCnt);
}
#endregion //注意:这里是实现类,不是接口,否则会报:ServiceHost 仅支持类服务类型。
host = new WebServiceHost( typeof(WcfYeah.Service1));
} public void Start()
{
host.Open();
} public void Close()
{
if (host != null)
{
host.Close();
}
}
}
}

二、在Windows服务中调用WCF

在windows服务库中引用WcfYeah这个项目,再引用System.ServiceModel.dll 和System.ServiceModel.Web.dll程序集。

修改windows服务的OnStart和OnStop方法,完整内容如下:

using CommonUtils;
using System;
using System.ServiceModel;
using System.ServiceProcess;
using WcfYeah; namespace ADemoWinSvc
{
public partial class Service1 : ServiceBase
{
WCFServer aw = null;
public Service1()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
try
{
if (aw == null)
{
aw = new WCFServer();
}
if (aw.host.State == CommunicationState.Opening || aw.host.State == CommunicationState.Opened)
{
GLog.WLog("[1]服务已启动。");
return;
} aw.Start(); GLog.WLog("[2]服务已启动");
}
catch (Exception ex)
{
GLog.WLog("OnStart ex:" + ex.Message);
}
} protected override void OnStop()
{
try
{
aw.Close(); GLog.WLog("服务已停止");
}
catch (Exception ex)
{
GLog.WLog("OnStop ex:" + ex.Message);
}
}
}
}

在windows服务库中添加一个应用配置文件(App.config),用来配置WCF服务,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <system.serviceModel>
<services>
<service name="WcfYeah.Service1" behaviorConfiguration="behaviorThrottled">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:16110/myapi/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址相对于上面提供的基址-->
<endpoint address="" binding="webHttpBinding" contract="WcfYeah.IService1" bindingConfiguration="WebHttpBinding_IService">
</endpoint>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="WebHttpBinding_IService" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorThrottled">
<serviceThrottling
maxConcurrentCalls="96"
maxConcurrentSessions="600"
maxConcurrentInstances="696"
/>
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="False" httpsGetEnabled="False"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel> </configuration>

编译ADemoWinSvc项目,将编译好的ADemoWinSvc.exe、ADemoWinSvc.exe.config和WcfYeah.dll这3个文件复制到WINFORM程序编译输出目录,与Windows服务操作.exe文件放在一起。

用管理员权限启动Windows服务操作.exe,点击安装按钮。

进入Logs文件夹,查看Logs文件,如果显示“[2]服务已启动”,说明windows服务安装成功,WCF正常启动。

使用POSTMAN调用。

地址:http://localhost:16110/myapi/geta

方法:POST

请求报文:

{
    "BoolValue": true,
    "StringValue": "11"
}
响应报文:
{
    "BoolValue": true,
    "StringValue": "输入实体不为空:2021/11/30 9:38:41"
}
 

C#.NET 操作Windows服务承载WCF的更多相关文章

  1. Windows服务承载WCF

    Source文件 ------------------------- using System; using System.Collections.Generic; using System.Linq ...

  2. C# 操作windows服务[启动、停止、卸载、安装]

    主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...

  3. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  4. C#通过SC命令和静态公共类来操作Windows服务

    调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...

  5. cmd命令行和bat批处理操作windows服务(转载)

    一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32srv ...

  6. C#开发人员能够可视化操作windows服务

    使用C#开发自己的定义windows服务是一个很简单的事.因此,当.我们需要发展自己windows它的服务.这是当我们需要有定期的计算机或运行某些程序的时候,我们开发.在这里,我有WCF监听案例,因为 ...

  7. SC命令---安装、开启、配置、关闭 cmd命令行和bat批处理操作windows服务

      一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32s ...

  8. 基于Windows服务的WCF

    (1)创建WCF 代码示例: [ServiceContract] public interface ILimsDBService { [OperationContract] int ExecuteSq ...

  9. 编写寄宿于windows服务的WCF服务

    由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的WCF服务就不适合寄宿于IIS中.IIS每隔一段时间w3wp进程会闲置超时,造成服务的运行停止,因此这种耗时或者定时任 ...

随机推荐

  1. 函数返回值为 const 指针、const 引用

    函数返回值为 const 指针,可以使得外部在得到这个指针后,不能修改其指向的内容.返回值为 const 引用同理. class CString { private: char* str; publi ...

  2. python的参数传递是值传递还是引用传递??

    函数参数传递机制,传值和引用的是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(pa ...

  3. kafka应用讲解及应用场景(三)

    一. 验证 1.进入bin目录 cd bin 2.ls查看脚本 会发现下面有很多脚本文件,由于我是要创建一个topic所有直接打开kafka-topics.sh脚本查看命令 打开脚本后发现里面有很多命 ...

  4. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  5. PCB设计中新手和老手都适用的七个基本技巧和策略

    本文将讨论新手和老手都适用的七个基本(而且重要的)技巧和策略.只要在设计过程中对这些技巧多加注意,就能减少设计回炉次数.设计时间和总体诊断难点. 技巧一:注重研究制造方法和代工厂化学处理过程 在这个无 ...

  6. 攻防世界 web2.robots

    输入ip/robots.txt,显示出了flag目录,直接访问.

  7. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)

    一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...

  8. Jquery取值方法汇总

    一.下拉框 1.jquery获取当前选中select的text值 var a = $("#ShareMoneyType").find("option:selected&q ...

  9. Oracle 19c 没有匹配的协议

    Oracle12c连接问题ORA-28040:没有匹配的验证协议 造成改问题的原因是客户端版本太低.修改sqlnet.ora文件可以让服务器适配低版本的客户端 sqlnet.ora文件中加入 SQLN ...

  10. shell脚本 PHP+swoole的安装

    #!bin/bash set -e # Check if user is root if [ $(id -u) != "0" ]; then echo "Error: p ...