C# WCF一个服务实例的多个通道
这是我的服务器应用程序代码:C# WCF一个服务实例的多个通道,c#,wcf,servicehost,C#,Wcf,Servicehost,这是我的服务器应用程序代码: [ServiceContract] public interface IFirst { [OperationContract] void First(); } [ServiceContract] public interface ISecond { [OperationContract] void Second(); } [ServiceBehavior(InstanceContextMode = InstanceContextM
[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();
}
}
在我的例子中,服务器创建了两个服务实例。我要做的是为第一个服务实例调用第二个函数。您可以做两件事:
移到第二个到第一个
public interface IFirst
{
[OperationContract]
void First();
[OperationContract]
void Second();
}
或者对服务实例使用单例
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class Service : IFirst, ISecond
{
...
}
把你的行为改成单身
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
当您使用InstanceContextMode.PerSession时,这意味着当您试图从两个客户端连接到服务时,服务会为每个客户端创建会话
,这就是它创建两个服务实例的原因
通过将其更改为InstanceContextMode。单个服务实例只能为您的两个客户端提供服务
从
System.ServiceModel.InstanceContext管理关联
在频道和用户定义的服务对象之间。使用
带有
ServiceBehaviorAttribute.InstanceContextMode属性来指定
InstanceContext对象的生存期。可以创建一个新的
每个调用、每个会话的InstanceContext对象,或指定
InstanceContext对象绑定到单个服务对象。
单个值指定在服务的生命周期内应使用单个InstanceContext对象。
我知道这个职位很老,但对其他人来说
您可以将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();
}
}
类客户端
{
静态void Main(字符串[]参数)
{
ChannelFactory combinedFactory=新的ChannelFactory(新的NetTcpBinding(),新的EndpointAddress(“net。tcp://localhost:8000"));
ICombinedFirstSecond ICombinedFirstSecond=combinedFactory.CreateChannel();
i组合FirstSecond.First();
i组合firstsecond.Second();
Console.ReadLine();
}
}
这是我认为你真正想要的,而不是一个单身服务
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();
}
}