2010-02-09 140 views
3

我有一个用Silverlight 3.0编写的应用程序。它使用RIA服务在客户端和服务器之间进行通信。RIA服务WCF超时

我的问题似乎没有在网上回答得很好。客户端使用RIA服务与服务器通信,后者在后台使用WCF。如果通信时间超过60秒,则会通过此消息超时,

'查询'ApplyUpgrade'的加载操作失败。 HTTP请求'http://localhost:52403/ClientBin/DatabaseUpgradeTool-Web-UpgradePackageDomainService.svc/binary'已超出分配的超时时间。分配给此操作的时间可能是更长时间的一部分。

我的服务器正在执行数据库升级,所以它的有效时间超过60秒。可能是双倍或三倍。

我想这样的设置在web.config,

<services> 
    <service name="DatabaseUpgradeTool.Web.UpgradePackageDomainService"> 
     <endpoint address="" binding="wsHttpBinding" contract="DatabaseUpgradeTool.Web.UpgradePackageDomainService"></endpoint> 
     <endpoint address="/soap" binding="basicHttpBinding" contract="DatabaseUpgradeTool.Web.UpgradePackageDomainService"></endpoint> 
     <endpoint address="/binary" binding="customBinding" bindingConfiguration="BinaryHttpBinding" contract="DatabaseUpgradeTool.Web.UpgradePackageDomainService"></endpoint> 
    </service> 
    </services> 
<bindings> 
    <customBinding> 
     <binding name="BinaryHttpBinding" 
       receiveTimeout="00:00:10" 
       sendTimeout="00:00:10" 
       openTimeout="00:00:10" 
       closeTimeout="00:00:10"> 
     <binaryMessageEncoding /> 
     <httpTransport keepAliveEnabled="true"/> 
     </binding> 
    </customBinding> 
    </bindings> 

仍然没有喜悦。任何想法,以什么是我上面尝试过什么是错的?我期望以上,导致它在10秒内超时,而不是60.

谢谢。

+0

请注意以上更新的问题。我在web.config中尝试了一些设置,但它们并没有奏效。它可能引发一些其他的见解 – peter 2010-02-09 21:20:21

+0

看看[相同的问题](http://stackoverflow.com/questions/1912762/configuring-the-timeout-for-a-wcf-ria-services-call-from-a -silverlight -3-客户端) – Timores 2010-08-09 10:16:34

回答

0

我面临同样的问题,我贴这个问题的答案问题在这里:Silverlight 4 WCF RIA Service Timeout Problem

下面是答案:

我会解释我的背景,我希望它会为我工作。我很确定。

首先调用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); 

    } 
} 

我期待您的反馈。