WCF交换服务接口
本文关键字:接口 服务 交换 WCF | 更新日期: 2023-09-27 18:17:41
我是WCF的新手,还在尝试。
我有两个这样的服务合同:
[ServiceContract]
public interface IFirst
{
[OperationContract(IsOneWay = true)]
void First();
}
[ServiceContract]
public interface ISecond
{
[OperationContract(IsOneWay = true)]
void Second();
}
在服务器端实现这些接口的客户端类:
public class Client : IFirst, ISecond
{
static int count = 0;
int id;
public Client()
{
count++;
id = count;
Console.WriteLine("{0} client created.", id);
}
public void First()
{
Console.WriteLine("First from: " + id.ToString());
}
public void Second()
{
Console.WriteLine("Second: " + id.ToString());
}
}
和主持人:
ServiceHost host = new ServiceHost(typeof(Client), new Uri("net.tcp://localhost:8000"));
NetTcpBinding binding = new NetTcpBinding();
host.AddServiceEndpoint(typeof(IFirst), binding, "");
host.AddServiceEndpoint(typeof(ISecond), binding, "");
host.Open();
客户端:
ChannelFactory<IFirst> firstFactory = new ChannelFactory<IFirst>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
IFirst iFirst = firstFactory.CreateChannel();
iFirst.First();
ChannelFactory<ISecond> secondFactory = new ChannelFactory<ISecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
ISecond iSecond = secondFactory.CreateChannel();
iSecond.First();
这很好。它分别调用First和Second方法,但每次调用都会创建Client类的新实例。这很明显,因为当客户端创建通道时,服务创建了客户端对象的新实例。我希望实现的是调用第二后第一,但为客户端相同的实例。这可能吗?我知道我可以把这两种方法放在一个服务中,但这不是我想要的。
根据我的理解,您想在只创建一个客户端时调用这两个方法。在WCF中,你可以通过设置服务行为属性的InstanceContextMode属性来控制实例化。有三种可能的值-PerCall-PerSession单一的
您可以使用PerSession,因为它使对象在客户机的下一次调用中保持活动状态。当会话结束时对象被释放
你可以装饰你的类[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
起初我对你称你的服务实现为"客户端"感到有点困惑:p
但是无论如何,默认情况下,WCF使用InstanceContextMode。PerCall,这意味着它将为每个请求实例化一个新的服务实现实例。
如果你想在同一个服务实例中处理后续的服务调用,你将不得不使用PerSession或Single InstanceContextModes。
http://msdn.microsoft.com/en-us/library/ms731193.aspx很好地总结了WCF中的会话、实例和并发。