一般的WCF服務可以通過設置配置文件中Timeout屬性值來自定義服務的超時時間,但WCF服務沒有配置文件,默認的超時是60s。但有時候,我們的查詢時間超過60s,我們能不能通過自己來定義超時時間呢。
答案是肯定的。RIA Services生成的代理類剛好是部分(partial)類,我們可以利用這一點來設置超時。
先在Service項目中建一個類:WcfTimeoutUtility,這里設置超時方法
/// <summary> /// Utility class for changing a domain context's WCF endpoint's /// SendTimeout. /// </summary> public static class WcfTimeoutUtility { /// <summary> /// Changes the WCF endpoint SendTimeout for the specified domain /// context. /// </summary> /// <param name="context">The domain context to modify.</param> /// <param name="sendTimeout">The new timeout value.</param> public static void ChangeWcfSendTimeout(DomainContext context, TimeSpan sendTimeout) { PropertyInfo channelFactoryProperty = context.DomainClient.GetType().GetProperty("ChannelFactory"); if (channelFactoryProperty == null) { throw new InvalidOperationException( "There is no 'ChannelFactory' property on the DomainClient."); } ChannelFactory factory = (ChannelFactory) channelFactoryProperty.GetValue(context.DomainClient, null); factory.Endpoint.Binding.SendTimeout = sendTimeout; } }
通過部分類的特性,來改變默認的時間。
注意,這里的類名:MyDomainContext要與你Service中自動生成的代碼中的DomainContext類名一樣,而且命名空間也應該也web.g.cs中DomainContext類一致。
public partial class MyDomainContext { partial void OnCreated() { TimeSpan tenMinutes = new TimeSpan(0, 10, 0); WcfTimeoutUtility.ChangeWcfSendTimeout(this, tenMinutes); } }