【问题标题】:WCF swap service interfacesWCF 交换服务接口
【发布时间】:2011-12-14 02:01:35
【问题描述】:

我是 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 类的新实例。很明显,因为当客户端创建通道时,服务会创建客户端对象的新实例。我希望实现的是在 First 之后调用 Second,但对于 Client 的同一实例。甚至可能吗?我知道我可以将这两种方法放在一项服务中,但这不是我想要的。

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    据我了解,您希望在仅创建一个客户端时调用这两种方法。 在 WCF 中,您可以通过设置服务行为属性的 InstanceContextMode 属性来控制实例化。有三个可能的值 -PerCall -每次会话 -单人

    您可以使用 PerSession,因为它使对象在客户端的下一次调用中保持活动状态。 会话结束时释放对象

    你可以装饰你的班级 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      起初我对您将服务实现称为“客户端”感到有些困惑:P

      但无论如何,默认情况下,WCF 使用 InstanceContextMode.PerCall,这意味着它将为每个进入 Service 的请求实例化一个新的 Service 实现实例。

      如果您希望在同一服务实例中处理后续服务调用,则必须使用 PerSession 或 Single InstanceContextModes。

      http://msdn.microsoft.com/en-us/library/ms731193.aspx 很好地总结了 WCF 中的会话、实例和并发。

      【讨论】:

        猜你喜欢
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多