網上有很多網友提問超時的問題,,,也有很多網友回答,,,但是很官方,,,
我也是網上提問的silverlight菜鳥之一,,,這個問題後來算是解決了,,,
在此留個腳印,希望對有同樣疑問的人有所幫助。。。
先介紹一下我的開發環境,,,Silverlight 4 + DomainService(WCF RIA,不是WCF)
(網上的回答大多基於WCF的方式,和WCF RIA二者還是有區別的,但這種區別大多被回答者自動忽視)
1、一般解決的方法是去修改OpenTimeout,ReceiveTimeout,SendTimeout,CloseTimeout
Public Sub ChangeWcfSendTimeout(ByVal context As DomainContext, ByVal Timeout As TimeSpan)
Dim channelFactoryProperty As PropertyInfo = context.DomainClient.GetType().GetProperty("ChannelFactory")
If channelFactoryProperty Is Nothing Then
Throw New InvalidOperationException(
"There is no 'ChannelFactory' property on the DomainClient.")
End If
Dim factory As ChannelFactory = CType(channelFactoryProperty.GetValue(context.DomainClient, Nothing), ChannelFactory)
factory.Endpoint.Binding.OpenTimeout = Timeout
factory.Endpoint.Binding.ReceiveTimeout = Timeout
factory.Endpoint.Binding.SendTimeout = Timeout
factory.Endpoint.Binding.CloseTimeout = Timeout
End Sub
2、還有一種超時問題,上面的方法不能解決。
應用場景是:SL調用存儲過程返回一個Entity,返回的數據量不大,問題在於這個存儲過程執行需要時間,必須要修改 TransactionTimeOut
<serviceBehaviors>
<serviceTimeouts transactionTimeout="00:06:00"/>
<serviceBehaviors>
3、相關上面的場景,存儲過程執行的時候,也有一個設定超時的屬性,在少數情況下也會導致超時
'Initializes a new FPDB object Inherits ObjectContext using the connection string
Public Sub New()
MyBase.New("name=FPDBConn", "FPDBConn")
MyBase.ContextOptions.LazyLoadingEnabled = True
Me.CommandTimeout = 360
OnContextCreated()
End Sub
4、還有一種僞超時,因爲後來證明,並不是超時問題,而是SL的序列化的size是有限制的
應用場景:有一個應用依據選擇的日期,去數據庫讀數據,當日期範圍不大,返回的數據量比較少時,沒有問題。
當選擇的日期範圍比較大,返回的數據超過臨界值時,就會報Not found錯誤
<behavior>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
4、沒有了,如果還有問題可以和我聯繫,一起探討
在此也送上一句官方回答:超時引起的原因有很多種,建議你打開WCF log以及使用fiddler監視網絡
原文網地址 http://www.cnblogs.com/youfan/archive/2011/06/09/2076094.html