2012-07-31 41 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屬性。