2010-11-11 223 views
2

我有一個Silverlight 4用戶控件,它調用一個運行時間很長的WCF RIA服務。如下所示,我正在增加默認的超時時間。Silverlight 4 WCF RIA服務超時問題

_domainContext = new WindowsDashboardDomainContext(); 
// Increase timeout -- this can be a very long running query 
((WebDomainClient<WindowsDashboardDomainContext.IWindowsDashboardDomainServiceContract>) 
_domainContext.DomainClient).ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan(99, 0, 0); 
    _domainContext.GetSections("All", "All", "All").Completed += GetAllSectionsCompleted; 

不幸的是,它似乎忽略此超時,仍然拋出超時異常:

Error: Unhandled Error in Silverlight Application Load operation failed for query 'GetClicks'. An error occurred while executing the command definition. See the inner exception for details. Inner exception message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

這究竟是爲什麼?

回答

1

有浮現在腦海兩種可能性:

  1. 您還沒有配置你的DomainService到serilalize足夠的對象。默認值非常小。嘗試this tip我在昨天放置增加結果集分配
  2. 您的數據源可能超時。在這種情況下,您需要相應地增加LINQ to SQL,EF或ADO.NET的命令超時時間。這是不太可能的原因,但需要考慮。
2

我在這裏回答了同樣的問題:WCF ria service SP1 timeout expired

答案:

我會解釋我的背景,我希望它會爲我工作。我很確定。

首先調用RIA服務,並使用一些領域的背景下,我的例子:

EmployeeDomainContext context = new EmployeeDomainContext(); 
InvokeOperation<bool> invokeOperation = context.GenerateTMEAccessByEmployee(1, 'Bob'); 
invokeOperation.Completed += (s, x) => 
    {....}; 

沒有新東西,直到這裏。與此同時,我每次在1分鐘後都面臨同樣的超時異常。我花了很多時間試圖去面對如何改變超時定義,我嘗試了Web.config中的所有可能的改變,而沒有做任何改變。解決的辦法是:

創建CustomEmployeeDomainContext,即在生成的代碼的相同路徑localizated的局部類和此類中使用的鉤方法OnCreate中改變創建域上下文的行爲。在這堂課你應該寫:

public partial class EmployeeDomainContext : DomainContext 
{ 
    partial void OnCreated() 
    { 
     PropertyInfo channelFactoryProperty = this.DomainClient.GetType().GetProperty("ChannelFactory"); 
     if (channelFactoryProperty == null) 
     { 
      throw new InvalidOperationException(
       "There is no 'ChannelFactory' property on the DomainClient."); 
     } 

     ChannelFactory factory = (ChannelFactory)channelFactoryProperty.GetValue(this.DomainClient, null); 

     factory.Endpoint.Binding.SendTimeout = new TimeSpan(0, 10, 0); 

    } 
} 

我期待您的反饋。