我有一个 silverlight 5 项目,它从我的业务逻辑层调用一个方法(一个 DomainService 类),这个调用方法返回一个字符串。我的问题是运行此方法可能需要几个小时才能执行,我需要一种方法来避免 RIA 超时。有什么想法吗?
使用 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,
};
两部分实现调用会更明智。
- 调用该方法以启动进程,返回令牌以跟踪状态
- 定期(每 5 分钟?)轮询另一种提交令牌并返回状态的方法
这比保持连接打开并等待要好得多。
另一种可能性是使用 SignalR 之类的东西来为你进行轮询。当服务器完成时,您希望几乎立即收到结果。
您可以将 OnCreated 部分方法用于 RIA 客户端域上下文
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);
}
}