Silverlight 4 WCF RIA服务超时问题

时间:2010-11-11 00:41:18

标签: silverlight silverlight-4.0 wcf

我有一个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;

不幸的是,它似乎忽略了这个超时并仍然抛出超时异常:

  

错误:对于查询“GetClicks”,Silverlight应用程序加载操作中的未处理错误失败。执行命令定义时发生错误。有关详细信息,请参阅内部异常内部异常消息:超时已过期。操作完成之前经过的超时时间或服务器没有响应。在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)

为什么会这样?

2 个答案:

答案 0 :(得分: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,它是在生成的代码的相同路径中本地化的部分类 ,并且此类使用钩子方法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); 

    }
}

我期待着您的反馈。

答案 1 :(得分:1)

有两种可能性可以想到:

  1. 您尚未将DomainService配置为对足够的对象进行备份。默认值非常小。试试我昨天提出的this tip来增加结果集分配
  2. 您的数据源可能已超时。在这种情况下,您需要相应地增加LINQ to SQL,EF或ADO.NET的命令超时。这是不太可能的原因,但需要考虑。