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 功能详细信息