[转]WCF一个Host实现多契约服务
因为最初错误的理解了Contract与Service的关系,把每个业务定义了相应的Contract与Service并将对应的Service一一继承相应的Contract,因为在WCF每个host只能提供一个Service所以导致,当你的服务很多的时候你要定义N多个host
看下面演示提供User(用户)和Order(订单)两个服务:
开启多个host代码:
host1.Open();
ServiceHost host2 = new ServiceHost(typeof(OrderService));
host2.Open();
开启多个host配置
代码

<services>
<service name="Wcf.Services.UserService">
<endpoint address="net.tcp://localhost:8001/UserService" binding="netTcpBinding" contract="Wcf.Contract.IUserService" >
</endpoint>
</service>
<service name="Wcf.Services.OrderService">
<endpoint address="net.tcp://localhost:8001/OrderService" binding="netTcpBinding" contract="Wcf.Contract.IOrderService" >
</endpoint>
</service>
</services>
</system.serviceModel>
参考:
WCF中ServiceHost能不能host多个服务?
http://www.cnblogs.com/vivid-stanley/archive/2007/02/21/653280.html
Host多个WCF服务(Self-host)
http://www.cnblogs.com/levinknight/archive/2007/05/25/760176.html
后来发现Service是可以和业务类型没关系的,它仅用来表示当前host能提供的服务,不要理解Service要根据不同的业务类型来切分,Contract才是和业务类型有关系的原则上要按照业务类型来切分。然后其实WCF并不推荐在应用程序域中创建多个ServiceHost实例。如果要托管多个服务,完全可以在一个host中通过多个Endpoint公开多个WCF服务的办法来实现,而每个Endpoint都可以对应相应的Contract。
User契约代码:
{
[ServiceContract]
public interface IUserService
{
[OperationContract]
void Edit();
}
}
Order契约代码:
{
[ServiceContract]
public interface IOrderService
{
[OperationContract]
void Add();
}
}
Service代码:让所有功能在一个Service上实现
代码

{
public class MallService : IUserService, IOrderService
{
public void Add()
{
throw new NotImplementedException();
}
void Edit()
{
throw new NotImplementedException();
}
}
}
当然这里可以使用 partial 关键字 把代码放在不同的文件上,来达到物理上的切分比如:
文件UserService.cs
public partial class MallService : IUserService
文件 OrderService.cs
public partial class MallService : IOrderService
host代码
代码

{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Wcf.Services.MallService)))
{
host.Open();
Console.Read();
}
}
}
}
配置文件:在一个service上定义多个endpoint使用不同的契约接口
代码

<services>
<service name="Wcf.Services.MallService" behaviorConfiguration="MallServiceBehaviors" >
<endpoint address="" contract="Wcf.Contract.IUserService" binding="basicHttpBinding"></endpoint>
<endpoint address="" contract="Wcf.Contract.IOrderService" binding="basicHttpBinding"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8899/MallService%22/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MallServiceBehaviors" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
客户端代码:客户端可以根据不同endpoint的契约实现不同的类
代码

{
class Program
{
static void Main(string[] args)
{
UserServiceClient user = new UserServiceClient();
user.Edit();
OrderServiceClient order = new OrderServiceClient();
order.Add();
}
}
}
以后如果要对WCF应用程序扩展只需定义契约 然后partial class MallService : 契约接口 实现代码, 并在host的在配置文件中加入 相应的 endpoint 即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?