这是我的服务器应用程序代码:
[ServiceContract]
public interface IFirst
{
[OperationContract]
void First();
}
[ServiceContract]
public interface ISecond
{
[OperationContract]
void Second();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class Service : IFirst, ISecond
{
static int count = 0;
int serviceID;
public Service()
{
serviceID = ++count;
Console.WriteLine("Service {0} created.", serviceID);
}
public void First()
{
Console.WriteLine("First function. ServiceID: {0}", serviceID);
}
public void Second()
{
Console.WriteLine("Second function. ServiceID: {0}", serviceID);
}
}
class Server
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Service), new Uri("net.tcp://localhost:8000"));
NetTcpBinding binding = new NetTcpBinding();
host.AddServiceEndpoint(typeof(IFirst), binding, "");
host.AddServiceEndpoint(typeof(ISecond), binding, "");
host.Open();
Console.WriteLine("Successfully opened port 8000.");
Console.ReadLine();
host.Close();
}
}
和客户:
class Client
{
static void Main(string[] args)
{
ChannelFactory<IFirst> firstFactory = new ChannelFactory<IFirst>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
IFirst iForst = firstFactory.CreateChannel();
iForst.First();
ChannelFactory<ISecond> secondFactory = new ChannelFactory<ISecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
ISecond iSecond = secondFactory.CreateChannel();
iSecond.Second();
Console.ReadLine();
}
}
当我运行它时,我得到输出:
Successfully opened port 8000.
Service 1 created.
First function. ServiceID: 1
Service 2 created.
Second function. ServiceID: 2
在我的案例中,服务器创建了两个Service实例。我想要做的是为First所做的同一个Service实例调用Second函数。
答案 0 :(得分:2)
你可以做两件事:
将第二名移至IFirst
public interface IFirst
{
[OperationContract]
void First();
[OperationContract]
void Second();
}
或者使用Singleton作为服务实例
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class Service : IFirst, ISecond
{
...
}
答案 1 :(得分:1)
将您的行为更改为单身
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
当您使用InstanceContextMode.PerSession
时,意味着服务为每个a session
创建client
,因为您尝试从两个客户端连接到服务,这就是为什么它创建两个服务实例
将其更改为InstanceContextMode.Single
只有一个服务实例将为您的两个客户提供服务。
来自MSDN
System.ServiceModel.InstanceContext 管理关联 在渠道和用户定义的服务对象之间。使用 InstanceContextMode枚举用 ServiceBehaviorAttribute.InstanceContextMode属性指定 InstanceContext对象的生命周期。可以创造一个新的 每个调用,每个会话或指定的InstanceContext对象 InstanceContext对象绑定到单个服务对象。 Single值指定应在服务的生命周期内使用单个InstanceContext对象。
答案 2 :(得分:0)
我知道这篇文章很老,但对其他人而言。
您可以做的是将您的IFirst和ISecond合并到ICombinedService中。 然后,您将在客户端中创建单个通道 - 这意味着将创建服务主机会话的单个实例。
在当前代码中,您正在为IFirst和ISecond创建连接[这些是您创建的两个会话实例。]
IFirst iForst = firstFactory.CreateChannel(); //第一次创建会议!
ISecond iSecond = secondFactory.CreateChannel(); //第二次会议创建!
要更改该行为,您需要将服务合并到一个服务中;并且可以对每个会话进行调用。
class Client
{
static void Main(string[] args)
{
ChannelFactory<ICombinedFirstSecond> combinedFactory = new ChannelFactory<ICombinedFirstSecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
ICombinedFirstSecond iCombinedFirstSecond = combinedFactory.CreateChannel();
iCombinedFirstSecond.First();
iCombinedFirstSecond.Second();
Console.ReadLine();
}
}
这是我认为你真正想要的,而不是单身人士服务。