我是WCF的新手并且仍在尝试。
我有两个这样的ServiceContract:
[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类的新实例。很明显,因为当客户端创建通道时,服务会创建Client对象的新实例。我希望实现的是先调用Second,但是对于Client的同一个实例。它甚至可能吗?我知道我可以把这两种方法放在一个服务中,但这不是我想要的。
答案 0 :(得分:1)
根据我的理解,您只想在创建一个客户端时调用这两种方法。 在WCF中,您可以通过设置Service Behavior Attribute的InstanceContextMode属性来控制Instancing。有三个可能的值 -PerCall -PerSession - 单
您可以使用PerSession,因为它可以使对象保持活动状态,以便从客户端进行下一次调用。 会话结束时释放对象
你可以装饰你的班级 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
希望这有帮助。
答案 1 :(得分:0)
起初我打电话给你的服务实施&#34;客户&#34; :P
但无论如何,默认情况下,WCF使用InstanceContextMode.PerCall,这意味着它将为服务中的每个请求实例化一个新的Service实现实例。
如果要在同一服务实例中处理后续服务调用,则必须使用PerSession或Single InstanceContextModes。
http://msdn.microsoft.com/en-us/library/ms731193.aspx很好地总结了WCF中的会话,实例和并发。