惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
IT之家
IT之家
博客园 - 聂微东
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
小众软件
小众软件
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
量子位
月光博客
月光博客
博客园 - 【当耐特】
博客园 - 叶小钗

博客园 - 黑羽飘舞

挥别虎年,迎来兔年 评论:B2Cer,其实您既不电子,也不商务 整理思路重新开始,一段乱七八糟的“电子商务创业”经历。--工作有风险,选公司要谨慎 什么是电子商务的核心竞争力 Subtext分析3-Subtext.Akismet [转]序列化与反序列化,及Json序列化反序列化 [转]JSON序列化与反序列化 [转]WCF分布式事务 抽象类,接口,委托与事件 Subtext分析2-Subtext.BlogML Subtext分析1-前言架构 博客园的管理团队都在做什么,博客园是个大杂烩么? 项目那点儿事---山寨篇(注释不是程序员的负担) 我的2008,感谢2008,挥别2008 文档知多少---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十五)[转] 葵花点穴手 定---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十四)[转] 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)[转] 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)[转] 我要飞的更高---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十一)[转]
[转]WCF一个Host实现多契约服务
黑羽飘舞 · 2010-05-23 · via 博客园 - 黑羽飘舞

因为最初错误的理解了Contract与Service的关系,把每个业务定义了相应的Contract与Service并将对应的Service一一继承相应的Contract,因为在WCF每个host只能提供一个Service所以导致,当你的服务很多的时候你要定义N多个host
看下面演示提供User(用户)和Order(订单)两个服务:

开启多个host代码:

ServiceHost host1 = new ServiceHost(typeof(UserService)); 
host1.Open();
ServiceHost host2 
= new ServiceHost(typeof(OrderService)); 
host2.Open();

开启多个host配置

代码 

代码

<system.serviceModel>
    
<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契约代码:

namespace Wcf.Contract
{
    [ServiceContract]
    
public interface IUserService
    {
        [OperationContract]
        
void Edit();
    }
}

 Order契约代码:

namespace Wcf.Contract
{
    [ServiceContract]
    
public interface IOrderService
    {
        [OperationContract]
        
void Add();
    }
}

Service代码:让所有功能在一个Service上实现

代码 

代码

namespace Wcf.Services
{
    
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代码

代码 

代码

namespace Wcf.Host
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
using (ServiceHost host = new ServiceHost(typeof(Wcf.Services.MallService)))
            {
                host.Open();
                Console.Read();
            }
        }
    }
}

配置文件:在一个service上定义多个endpoint使用不同的契约接口

代码 

代码

<system.serviceModel>
    
<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的契约实现不同的类

代码 

代码

namespace Wcf.Test
{
    
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 即可