WCF的出现,无疑验证了那句“分久必合,和久必分”传世经典。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
WCF整合了Remoting和webService等等。而且开发简单(相对的),它既弥补Remoting的只能在.net上运行,又弥补了asmx只能单向传送消息的缺点。也就是说,WCF是实现跨平台,在跨平台的同时,也可以双向通信。在WCF的编程思想中,无疑将SOA的思想体现的淋漓尽致。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
首先要做的是就是定义服务契约。定义契约一般使用接口,使得实现和消费这个服务的双方都要按照这个契约来实现相应的接口。在双向通信中至少要定义两个服务,一个服务是供消费程序消费的,另一个则是在callBack的时候调用的服务,这个服务应该由消费程序实现。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
其次,就是在服务端实现这些契约(说白了就是实现上面定义的接口)。在开发中,我们经常会把这个实现独立出来,方便在不同的宿主中发布这些服务。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
最后,实现客户端。在双向通信中,客户端也是服务端,因为它也实现了服务契约。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
来段代码:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Contract:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
namespace Lin.Contractƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    [ServiceContract(CallbackContract
=typeof(ICallBack))]ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
interface IHelloƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        [OperationContract]ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
void SayHelloTo(string userName);ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
namespace Lin.Contractƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    [ServiceContract]ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
interface ICallBackƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        [OperationContract]ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
void ReceiveTime(DateTime time);ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Service:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
namespace Lin.Serviceƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    [ServiceBehavior(ConcurrencyMode
= ConcurrencyMode.Reentrant)]ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
class ServiceHello : IHelloƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
IHello 成员#region IHello 成员ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
void SayHelloTo(string userName)ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            Console.WriteLine(
"Hello {0}", userName);ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            OperationContext.Current.GetCallbackChannel
<ICallBack>().ReceiveTime(DateTime.Now);ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
#endregionƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Host:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
class Programƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
staticƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
void Main(string[] args)ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
           
using (ServiceHost host =ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
new ServiceHost(typeof(ServiceHello)))ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
           
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
                host.Open();ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
                Console.Read();ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Client:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
namespace Lin.Clientƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
class ClientCallBack:ICallBackƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
ICallBack 成员#region ICallBack 成员ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
void ReceiveTime(DateTime time)ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            Console.WriteLine(
"服务器收到消息的时间是:{0}", time.ToLongTimeString());ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
#endregionƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
调用服务:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
namespace Lin.Clientƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
class ClientHello : DuplexClientBase<IHello>, IHelloƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
public ClientHello(InstanceContext instance) : base(instance) { }ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
IHello 成员#region IHello 成员ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
publicƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
void SayHelloTo(string userName)ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
           
base.Channel.SayHelloTo(userName);ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
#endregionƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
class Programƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
   
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
staticƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
void Main(string[] args)ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            Hello();ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            Console.Read();ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
staticƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
void Hello()ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
       
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            ClientCallBack callBack
=ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
new ClientCallBack();ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            ClientHello hello
=ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
new ClientHello(new InstanceContext(callBack));ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
           
string commandString =ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
string.Empty;ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
           
while (commandString !=ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
"exit")ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
           
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
                commandString
= Console.ReadLine();ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
                hello.SayHelloTo(commandString);ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
            }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
        }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
    }
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
大概是一年前,看见csdn在上面狂吹SOA,没想到这个看起来很神奇的东西,事实上并不是很神奇,如同OO的出现一样,有些人是注重OO的思想,有些人注重OO的实现。同样的,SOA应该更多的是提倡一种面向服务架构的思想。SOA如何实现,这个不重要,每个平台都有自己的实现方式。这也体现了技术要服务于社会。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’