【问题标题】:Silverlight DomainService TimeoutSilverlight 域服务超时
【发布时间】:2014-01-16 11:29:35
【问题描述】:

我有一个 silverlight 5 项目,它从我的业务逻辑层调用一个方法(一个 DomainService 类),这个调用方法返回一个字符串。我的问题是运行此方法可能需要几个小时才能执行,我需要一种方法来避免 RIA 超时。 有任何想法吗?

【问题讨论】:

标签: c# silverlight timeout silverlight-5.0 wcf-ria-services


【解决方案1】:

使用 OpenRIAServices 5.0.0,您需要执行以下操作
声明您自己的自定义服务工厂,并调整超时设置

public partial class MyDomainClientFactory : WebDomainClientFactory
{
   protected override Binding CreateBinding(Uri endpoint, bool requiresSecureEndpoint)
   {
       var binding = base.CreateBinding(endpoint, requiresSecureEndpoint);
       binding.SendTimeout = new TimeSpan(0, 30, 0);
       binding.ReceiveTimeout = new TimeSpan(0, 30, 0);
       binding.OpenTimeout = new TimeSpan(0, 30, 0);
       binding.CloseTimeout = new TimeSpan(0, 30, 0);
       return binding;
   }
}

然后你通过设置 DomainContext 的 DomainClientFactory 来使用它

DomainContext.DomainClientFactory = new MyDomainClientFactory()
{
    ServerBaseUri = MyServiceVPSUri,
};

【讨论】:

    【解决方案2】:

    分两部分实现调用会更明智。

    1. 调用方法启动进程,返回token跟踪状态
    2. 定期(每 5 分钟?)轮询另一个提交令牌并返回状态的方法

    这比让连接打开并等待要好得多。

    另一种可能性是使用 SignalR 之类的工具为您进行轮询。当服务器完成时,您会期望几乎立即收到结果。

    【讨论】:

      【解决方案3】:

      您可以对 RIA 客户端域上下文使用 OnCreated 部分方法

      public partial class DSMain
      {
          partial void OnCreated()
          {
              if (Application.Current.IsRunningOutOfBrowser)
              {
                  ClientHttpAuthenticationUtility.ShareCookieContainer(this);
              }
      
              System.ServiceModel.DomainServices.Client.WebDomainClient<Main.Services.IDSContract> dctx = this.DomainClient as System.ServiceModel.DomainServices.Client.WebDomainClient<Main.Services.IDSContract>;
              ChannelFactory factory = dctx.ChannelFactory;
      
              System.ServiceModel.Channels.CustomBinding binding = factory.Endpoint.Binding as System.ServiceModel.Channels.CustomBinding;
              binding.SendTimeout = new TimeSpan(0, 30, 0);
              binding.ReceiveTimeout = new TimeSpan(0, 30, 0);
              binding.OpenTimeout = new TimeSpan(0, 30, 0);
              binding.CloseTimeout = new TimeSpan(0, 30, 0);
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 2011-07-20
        • 2010-11-24
        相关资源
        最近更新 更多