[英]WCF swap service interfaces
我是WCF的新手,仍在尝试中。
我有两个这样的ServiceContract:
[ServiceContract]
public interface IFirst
{
[OperationContract(IsOneWay = true)]
void First();
}
[ServiceContract]
public interface ISecond
{
[OperationContract(IsOneWay = true)]
void Second();
}
在实现这些接口的服务器端Client类上:
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类的新实例。 很明显,因为当客户端创建频道时,服务会创建客户端对象的新实例。 我希望实现的是在Client的相同实例下调用Second after First。 可能吗 我知道我可以将这两种方法合而为一,但这不是我想要的。
根据我的理解,您只想在创建一个客户端的同时调用这两种方法。 在WCF中,您可以通过设置服务行为属性的InstanceContextMode属性来控制实例化。 有三个可能的值-PerCall -PerSession -Single
您可以使用PerSession,因为它可以使对象在客户端的下一次调用中保持活动状态。 会话结束时释放对象
您可以装饰您的类[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
希望这可以帮助。
起初,您将您的服务实现称为“客户”:P使我有些困惑
但是无论如何,默认情况下,WCF使用InstanceContextMode.PerCall,这意味着它将为进入Service的每个请求实例化一个新的Service实现实例。
如果要在同一服务实例中处理后续服务调用,则必须使用PerSession或Single InstanceContextModes。
http://msdn.microsoft.com/zh-cn/library/ms731193.aspx很好地总结了WCF中的会话,实例和并发性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.