2009-06-09 126 views
2

我想將會話超時設置爲30秒。WCF會話超時

要做到這一點,我寫:

<wsHttpBinding> 
    <binding name="ServicesBindings"> 
     <security mode="Message"> 
     <message clientCredentialType="Certificate"/> 
     </security> 
     <reliableSession enabled="true" inactivityTimeout="00:00:30"/> 
    </binding> 
    </wsHttpBinding> 

但它不工作!

如果我以這種方式設置:

<wsHttpBinding> 
    <binding name="ServicesBindings" receiveTimeout="00:00:30"> 
     <security mode="Message"> 
     <message clientCredentialType="Certificate"/> 
     </security> 
     <reliableSession enabled="true"/> 
    </binding> 
    </wsHttpBinding> 

這是正確的。

有人可以向我解釋這個嗎?

謝謝,

阿爾貝託

回答

0

根據this person,有一個receiveTimeout覆蓋了inactivityTimeout的錯誤。

1

InactivityTimeout用於ReliableSession。這是通道保持打開的時間,而沒有應用程序消息正在線路上發送。因此,如果您有一個客戶端調用操作,然後休眠一段時間,如果客戶端在配置的超時時間內不向服務發送另一條消息,則非活動超時會使客戶端通道出現故障。 ReceiveTimeout是單個接收操作可以持續多長時間。例如,客戶端向服務發送消息。如果該服務比ReceiveTimeout花費更長的時間來完成讀取該消息,它將會出錯。 同樣,SendTimeout是單個發送操作可以持續多長時間的超時。

簡單地說 - (發送/接收)超時控制允許發送和接收消息的時間。 InactivityTimeout是會話的一個設置,與您允許不發生任何事情的時間有關。

如果打開Fiddler並觀察電報上的消息,您將看到,如果發送消息之間有一個大的InactivityTimeout和足夠長的空閒時間,則會有由基礎ReliableSessionBindingElement發送的「Keep Alive」消息到儘管沒有從應用程序層進行通信,但仍保持通道存活。