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

WCF服务通信框架

文章速览

  • WCF服务通信框架
    • 概述
    • 一、服务端(Service)
      • 服务接口(Service Contract)
      • 服务实现(Service Implmentation)
    • 二、服务宿主(Service Host)
    • 三、客户端(Client)
        • 客户端配置
        • 客户端实现
    • 绑定(Binding)
    • 契约(Contract)
    • 调用关系总结
      • 1、服务端
      • 2、客户端
      • 3、通信过程
    • 示例代码
      • 服务端代码
      • 客户端代码
    • 查看更多

一个赞,留下专属于你的足迹!

WCF服务通信框架

概述

用于构建分布式应用程序,支持多种通信协议(HTTP、TCP、NamedPipes等)。

调用关系主要包括以下部分:

1、服务端(Service):提供功能和操作;

2、服务宿主(Service Host):启动和托管服务;

3、客户端(Client):调用服务端的功能;

4、绑定(Binding):定义客户端和服务端之间的通信方式;

5、契约(Contract):定义服务端可以提供的操作接口。

一、服务端(Service)

WCF核心部分,定义可以被客户端调用的操作。服务端通常包括以下部分:

服务接口(Service Contract)

服务接口定义了服务可以提供的操作,例如:

'''
[ServiceContract] /*标记这是一个服务接口*/
public interface IInvokeService{[OperationContract]/*标记这是一个服务操作*/void DoOperation(string operationName,params object[] )
}
'''

服务实现(Service Implmentation)

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class InvokeService : IInvokeService
{public void DoOperation(string operationName, params object[] args){try{// 执行具体的操作逻辑OP.DoOperation(operationName, args);}catch (Exception ex){LOG.Error(string.Format("调用{0},碰到未处理的WCF操作异常", operationName), ex);}}
}

其中的OP是一个对象,封装了实际的业务操作逻辑

  • operationName:表示要执行的操作名称。
  • args:表示操作的参数,是一个可变参数数组。

[ServiceBehavior]:定义服务行为,例如实力模式(InstanceContextMode)和并发模式(Concurrency Mode)

​ InstanceContextMode.Single:表示服务是单实例的,所有客户端共享同一个服务实例。

​ ConcurrencyMode.Multiple:表示服务可以同时处理多个请求。

二、服务宿主(Service Host)

服务宿主用于启动和托管服务。

服务宿主可以是控制台程序、windows服务或IIS。例如:

class Program
{static void Main(string[] args){using (ServiceHost host = new ServiceHost(typeof(InvokeService))){host.Open();Console.WriteLine("Service is running...");Console.ReadLine();}}
}

使用ServiceHost托管InvokeService。

调用host.Open()启动服务。

服务运行时,客户端可以通过配置的端点地址访问服务。

三、客户端(Client)

客户端通过代理对象调用服务端的功能。

客户端通常包括以下部分:

客户端配置

客户端需要配置WCF绑定和端点地址。这通常在配置文件(如 app.config 或 web.config)中完成。

例如:

<system.serviceModel><bindings><basicHttpBinding><binding name="BasicHttpBinding_InvokeService" /></basicHttpBinding></bindings><client><endpoint address="http://localhost:8000/InvokeService"binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_InvokeService"contract="IInvokeService" /></client>
</system.serviceModel>

配置了basicHttpBinding。

定义一个客户端端点,指向服务的地址。

客户端实现

客户端通过 ServiceClientWrapper 类来封装WCF客户端的通信逻辑。

例如:

public class InvokeServiceClient : ServiceClientWrapper<IInvokeService>, IInvokeService
{public InvokeServiceClient(): base("BasicHttpBinding_InvokeService", "InvokeService"){}public void DoOperation(string operationName, params object[] args){Invoke(svc => { svc.DoOperation(operationName, args); });}
}

InvokeServiceClient 继承自 Service Client Wrapper。

构造函数中,通过ServiceClientWrapper的构造函数传递了绑定配置名称和服务名称。

在DoOperation方法中,通过Invoke方法调用服务的操作

此处的svc是通过ServiceClientWrapper类的Invoke方法传递的一个代理对象,是其中_proxy的一个实例,代表与服务端通信的通道

绑定(Binding)

定义了客户端和服务端之间的通信方式。

WCF支持多种绑定,例如:

​ BasicHttpBinding:基于HTTP的绑定,适用于简单的web服务场景;

​ NetTcpBinding:基于TCP的绑定,适用于高性能的跨机器通信。

​ NetNamedPipeBinding:基于命名管道的绑定,适用于同一台机器上的高性能通信。

契约(Contract)

定义了服务可以提供的操作接口。

例如:

[ServiceContract]
public interface IInvokeService
{[OperationContract]void DoOperation(string operationName, params object[] args);
}
  • [ServiceContract]:标记这是一个服务接口。
  • [OperationContract]:标记这是一个服务操作。

调用关系总结

1、服务端

​ 定义服务接口(IInvokeService)

​ 实现服务接口(InvokeService)

​ 使用ServiceHost启动服务

2、客户端

​ 配置WCF绑定和端点地址

​ 使用ServiceClientWrapper封装WCF客户端的通信逻辑

​ 通过Invoke方法调用服务的操作

3、通信过程

​ 客户端通过配置的绑定和端点地址连接到服务端

​ 客户端调用服务的操作(如 DoOperation)

​ 服务端处理请求并返回结果

示例代码

服务端代码

// 服务接口
[ServiceContract]
public interface IInvokeService
{[OperationContract]void DoOperation(string operationName, params object[] args);
}// 服务实现
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class InvokeService : IInvokeService
{public void DoOperation(string operationName, params object[] args){try{// 执行具体的操作逻辑OP.DoOperation(operationName, args);}catch (Exception ex){LOG.Error(string.Format("调用{0},碰到未处理的WCF操作异常", operationName), ex);}}
}// 服务宿主
class Program
{static void Main(string[] args){using (ServiceHost host = new ServiceHost(typeof(InvokeService))){host.Open();Console.WriteLine("Service is running...");Console.ReadLine();}}
}

客户端代码

// 客户端封装类
public class ServiceClientWrapper<T>
{ChannelFactory<T> _factory;T _proxy;public ServiceClientWrapper(string endpointConfigurationName, string name){_factory = new ChannelFactory<T>(endpointConfigurationName);}public void Invoke(Action<T> action){if (_factory == null)return;if (_proxy == null){_proxy = _factory.CreateChannel();}for (int i = 0; i < 2; i++){if (Do(action))break;Thread.Sleep(10);}}bool Do(Action<T> action){if (_proxy != null && ((IClientChannel)_proxy).State == CommunicationState.Faulted){((IClientChannel)_proxy).Abort();_proxy = _factory.CreateChannel();}try{action(_proxy);return true;}catch (Exception ex){LOG.Error("Service call failed", ex);((IClientChannel)_proxy).Abort();_proxy = _factory.CreateChannel();return false;}}
}// 客户端实现
public class InvokeServiceClient : ServiceClientWrapper<IInvokeService>, IInvokeService
{public InvokeServiceClient(): base("BasicHttpBinding_InvokeService", "InvokeService"){}public void DoOperation(string operationName, params object[] args){Invoke(svc => { svc.DoOperation(operationName, args); });}
}// 客户端调用
class Program
{static void Main(string[] args){InvokeServiceClient client = new InvokeServiceClient();client.DoOperation("TestOperation", "arg1", "arg2");}
}

查看更多

WCF 功能详细信息

http://www.dtcms.com/a/303242.html

相关文章:

  • 用友NC漏洞批量检测工具,支持POC显示、单一检测、批量检测、结果导出、AI交互等
  • Parasoft Virtualize用服务虚拟化加速银行系统的软件测试
  • Red Hat OpenShift AI 产品简介
  • XCF32PVOG48C Xilinx Platform Flash PROM
  • 神经网络CNN、RNN、Transform
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Docker 部署 Supabase并连接
  • 【Linux】重生之从零开始学习运维之Mysql
  • 深度学习篇---层与层之间搭配
  • 基于Qlearning强化学习的水下无人航行器路径规划与避障系统matlab性能仿真
  • 免费离线翻译软件LibreTranslate免安装一键启动整合包下载
  • JavaScript 回调函数讲解_callback
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • 波形发生器AWG硬件设计方案
  • AW2013 LED驱动芯片 工作方式介绍
  • Java线程池详解:核心参数与工作原理
  • PBR(策略路由)
  • 力扣-39.组合总和
  • 一段英文自我介绍
  • Source Insight的快速使用
  • gpfs磁盘相关命令及使用
  • nvim编辑器
  • CLion运行多个main函数
  • MySQL存储过程(二):存储过程实例(增删改查)及调用
  • Web3技术解析:从网络架构到业务创新的范式的变革
  • mysql全量备份、全量恢复demo
  • 二叉树基本概念
  • 安装anaconda后,如何进入python解释器
  • 禾纳AET3156AP数据手册,增强型p沟道MOSFET芯片,替代AO4805方案
  • C#_运算符重载 operator