如何让.NET 4.7.2 Web API通过SSL/TLS连接控制台应用传输数据
实现Web API与SSL/TLS监听的控制台应用直接数据收发(.NET 4.7.2)
你不需要额外搭建HTTP服务器,直接利用TCP+SSL/TLS实现双向通信即可,以下是两种可行的实现思路:
方案一:基于SslStream的原生TCP+SSL/TLS实现
这种方式贴近底层,可自定义通信协议,适合对数据格式和性能有严格要求的场景。
控制台端(SSL/TLS服务端)
以下是完整的服务端实现(包含SSL证书加载和连接处理):
using System; using System.Net; using System.Net.Sockets; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; class SslTcpServer { private static X509Certificate2 _serverCert; static async Task Main(string[] args) { // 加载SSL证书(替换为你的PFX证书路径和密码) _serverCert = new X509Certificate2("server-cert.pfx", "your-cert-password"); // 监听指定端口(支持所有网卡) var listener = new TcpListener(IPAddress.Any, 12345); listener.Start(); Console.WriteLine("SSL/TLS服务已启动,监听端口12345"); while (true) { // 异步接受客户端连接 var client = await listener.AcceptTcpClientAsync(); // 后台处理连接,不阻塞主线程 _ = HandleClientConnection(client); } } private static async Task HandleClientConnection(TcpClient client) { using (client) using (var sslStream = new SslStream(client.GetStream(), false)) { try { // 执行SSL/TLS握手,关闭客户端证书验证(按需开启) await sslStream.AuthenticateAsServerAsync( _serverCert, clientCertificateRequired: false, checkCertificateRevocation: false); // 读取Web API发送的数据 var buffer = new byte[1024]; var bytesRead = await sslStream.ReadAsync(buffer, 0, buffer.Length); var requestData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到数据:{requestData}"); // 发送响应给Web API var response = $"控制台已接收数据:{requestData}"; var responseBuffer = Encoding.UTF8.GetBytes(response); await sslStream.WriteAsync(responseBuffer, 0, responseBuffer.Length); } catch (Exception ex) { Console.WriteLine($"连接处理异常:{ex.Message}"); } } } }
Web API端(SSL/TLS客户端)
在Web API控制器中实现客户端逻辑,主动连接控制台的SSL/TLS服务:
using System; using System.Net.Sockets; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using System.Web.Http; public class ConsoleConnectorController : ApiController { [HttpPost] public async Task<IHttpActionResult> SendData([FromBody] string data) { // 替换为控制台应用所在机器的IP和监听端口 var consoleIp = "192.168.xxx.xxx"; const int consolePort = 12345; using (var client = new TcpClient()) { await client.ConnectAsync(consoleIp, consolePort); using (var sslStream = new SslStream(client.GetStream(), false, ValidateServerCert)) { try { // 发起SSL/TLS握手 await sslStream.AuthenticateAsClientAsync(consoleIp); // 发送数据到控制台 var dataBuffer = Encoding.UTF8.GetBytes(data); await sslStream.WriteAsync(dataBuffer, 0, dataBuffer.Length); // 读取控制台响应 var responseBuffer = new byte[1024]; var bytesRead = await sslStream.ReadAsync(responseBuffer, 0, responseBuffer.Length); var response = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead); return Ok(new { Success = true, ConsoleResponse = response }); } catch (Exception ex) { return InternalServerError(ex); } } } } // 验证服务器证书(测试环境可跳过严格验证,生产环境需完善逻辑) private static bool ValidateServerCert(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) { // 生产环境请根据证书颁发机构、有效期等进行严格验证 if (errors == SslPolicyErrors.None) return true; Console.WriteLine($"证书验证错误:{errors}"); // 自签名证书可返回true,生产环境不建议 return true; } }
方案二:使用WCF实现SSL/TLS通信
WCF是.NET4.7.2原生支持的通信框架,自带SSL/TLS配置,无需手动处理底层流,开发效率更高。
控制台端(WCF服务端)
- 定义服务契约:
using System.ServiceModel; [ServiceContract] public interface IConsoleDataService { [OperationContract] string ExchangeData(string input); } public class ConsoleDataService : IConsoleDataService { public string ExchangeData(string input) { Console.WriteLine($"Web API发送数据:{input}"); return $"控制台响应:已处理数据「{input}」"; } }
- 启动WCF服务(启用SSL/TLS):
using System; using System.ServiceModel; class WcfSslServer { static void Main(string[] args) { // 使用WSHttpBinding启用Transport层SSL/TLS var binding = new WSHttpBinding(SecurityMode.Transport); binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; // 服务地址(HTTPS协议) var serviceUri = new Uri("https://0.0.0.0:12345/ConsoleDataService"); using (var host = new ServiceHost(typeof(ConsoleDataService), serviceUri)) { host.AddServiceEndpoint(typeof(IConsoleDataService), binding, ""); // 配置服务证书(需提前将证书绑定到端口,或通过代码指定指纹) // host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "证书指纹"); host.Open(); Console.WriteLine($"WCF SSL服务已启动,地址:{serviceUri}"); Console.ReadLine(); } } }
Web API端(WCF客户端)
- 添加服务引用:在Web API项目中右键「添加」→「服务引用」,输入控制台的WCF服务地址生成客户端代理。
- 在控制器中调用服务:
using System.Web.Http; using YourServiceReferenceNamespace; // 替换为实际的服务引用命名空间 public class WcfConsoleClientController : ApiController { [HttpPost] public IHttpActionResult SendDataToConsole([FromBody] string data) { try { using (var client = new ConsoleDataServiceClient()) { var response = client.ExchangeData(data); return Ok(new { Success = true, Response = response }); } } catch (Exception ex) { return InternalServerError(ex); } } }
关键注意事项
- 证书配置:两种方案都需要SSL证书,测试可用自签名证书,生产环境必须使用CA颁发的合法证书;证书需绑定到控制台监听的端口(可通过
netsh http add sslcert命令配置)。 - 防火墙设置:确保控制台所在机器的监听端口(如12345)对外开放,允许Web API机器的入站连接。
- 连接策略:如果需要频繁通信,可复用SSL/TLS连接避免重复握手;单次请求则使用短连接更简洁。
- 兼容性:两种方案都完全兼容.NET4.7.2,无需额外安装依赖。
内容的提问来源于stack exchange,提问作者Tran Audi
相关产品推荐
相关产品推荐

