2012-07-31 102 views
0

我写一个WCF客户端和正在使用的ChannelFactory创建我的代理人对我的服务:获取WCF的SessionID在客户端

[ServiceContract] 
    interface Service { 

     [OperationContract] 
     void Operation(); 
    } 


var proxy = ChannelFactory<MyServiceInterface>.CreateChannel(
      new BasicHttpBinding(), 
      new EndpointAddress("http://localhost:8000/")); 

我将如何去获取SessionID的?代理只具有基本的Object方法以及在MyServiceInterface中定义的方法。

预先感谢您。

+0

我们无法看到您在MyServiceInterface中定义会话的方式 – MethodMan 2012-07-31 22:17:12

回答

1

试试这个:

在WCF服务文件(.SVC)增加以下内容:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class Service1 : IService1 
{ 
    public string SessionId() 
    { 
     return OperationContext.Current.SessionId; 
    } 
} 

在您的WCF Service接口添加以下内容:

[ServiceContract(SessionMode = SessionMode.Required)] 
public interface IService1 
{ 
    [OperationContract] 
    string SessionId(); 
} 

在你的客户,请执行以下操作:

ChannelFactory<IService1> factory = new ChannelFactory<IService1>(
     new WSHttpBinding(), new EndpointAddress("http://localhost:4213/Service1.svc")); 
    IService1 proxy = factory.CreateChannel(); 

    Console.WriteLine(proxy.SessionId()); 

    ((IClientChannel)proxy).Close(); 
    factory.Close(); 

    Console.Read(); 

通过这样做,您可以获得在服务端创建的代理会话。只是要知道,当((IClientChannel)proxy).Close();factory.Close();被调用时,代理将获得新的会话。

+0

我不确定我是否缺少某些内容,但是没有在代理对象上看到.SessionId()。 – rynojvr 2012-07-31 22:34:55

+0

我应该创建一个轮询服务器的会话ID的操作吗? – rynojvr 2012-07-31 22:44:34

+0

@rynojvr看看我编辑的帖子。 – 2012-07-31 23:03:19

0

这不是我想要让SessionId()成为OperationContract。如果不是使用ChannelFactory,我通过扩展ClientBase <>创建了自己的代理,并且这使我可以访问InnerChannel.SessionId属性。