我正在使用Silverlight 3.0的WCF RIA Services Beta,我希望能够从客户端配置超时。我知道底层技术是WCF,默认超时似乎是我所期望的60秒。
是否有一种简单的方法来控制此WCF和其他WCF设置?
我首先想到的是尝试在RIA服务之前提供的 RIA服务概述 pdf文件中提到的DomainContext OnCreated 挂钩点公测。 DomainContext对象的MSDN文档不再提及该方法,尽管它仍然存在?我不确定这是文件落后的情况还是我不应该使用这个扩展点的指示。
namespace Example.UI.Web.Services
{
public sealed partial class CustomDomainContext
{
partial void OnCreated()
{
// Try and get hold of the WCF config from here
}
}
}
答案 0 :(得分:3)
创建域上下文后的任一行:
((WebDomainClient<LibraryDomainContext.ILibraryDomainServiceContract>)this.DomainClient).ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan(0, 5, 0);
或部分类
public partial class LibraryDomainContext
{
partial void OnCreated()
{
if(DesignerProperties.GetIsInDesignMode(App.Current.RootVisual))
((WebDomainClient<LibraryDomainContext.ILibraryDomainServiceContract>)this.DomainClient).ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan(0, 5, 0);
}
}
答案 1 :(得分:1)
作为参考, near 下面的代码可以使用,但是您无法使用Silverlight中的反射访问私有成员。尽管如此,不会对这个 hack 感到满意。有趣的是,有一个WebDomainClient构造函数接受Binding参数private WebDomainClient(Uri serviceUri, bool usesHttps, Binding binding)
,但此状态的XML Comment Private构造函数。一旦我们在WCF 之上有一个端到端的可扩展性故事,就应该公开。看起来我必须等待一段时间才能向我们公开这种配置。
public sealed partial class AppDomainContext
{
partial void OnCreated()
{
var webDomainClient = ((WebDomainClient<AppDomainContext.IAppDomainServiceContract>)this.DomainClient);
// Can I use reflection here to get hold of the Binding
var bindingField = webDomainClient.GetType().GetField("_binding", BindingFlags.NonPublic | BindingFlags.Instance);
// In Silverlight, the value of a private field cannot be access by using reflection so the GetValue call throws an exception
// http://msdn.microsoft.com/en-us/library/4ek9c21e%28VS.95%29.aspx
var binding = bindingField.GetValue(webDomainClient) as System.ServiceModel.Channels.Binding;
// So near yet so far!!
binding.SendTimeout = new TimeSpan(0,0,1);
}
}