WCF RIA 解决超时报错问题
前两天做项目时遇到了数据量过大导致WCF超时的问题,遇到问题自然就要解决啊,于是在网上找资料,找了大量的资料,看着那些看不懂的配置,捣鼓了一两天仍没解决这个问题。
后来终于被我找到解决方案,原来我之前一直没找到的原因有二
一、我讨厌英语网页,实际答案已找到 ,没去看
二、wcf ria的超时问题 和wcf的超时问题不一样,网上说的方法都是普通的wcf的超时问题,可以在配置里面进行配置,但是WCF RIA 必须要在运行时配置
具体方法如下:
给WCF的DomainContext 加一个分部类, 因为原先的DomainContext是自动生成的,所以更改之后就会自动改回去,加一个分部类
具体命名空间如下 public partial class TeachingDomainContext : DomainContext, 类的名称和原先类一样 ,加上 partial 关键字
然后在此类中写一个设置时间方法 具体方法如下
/// <summary>
/// 修改超时时间
/// </summary>
/// <param name="context">超时时间修改.</param>
/// <param name="sendTimeout">超时时间</param>
public static void ChangeWcfSendTimeout(DomainContext context,
TimeSpan sendTimeout)
{
PropertyInfo channelFactoryProperty =
context.DomainClient.GetType().GetProperty("ChannelFactory");
if (channelFactoryProperty == null)
{
throw new InvalidOperationException(
"超时错误.");
}
/// 修改超时时间
/// </summary>
/// <param name="context">超时时间修改.</param>
/// <param name="sendTimeout">超时时间</param>
public static void ChangeWcfSendTimeout(DomainContext context,
TimeSpan sendTimeout)
{
PropertyInfo channelFactoryProperty =
context.DomainClient.GetType().GetProperty("ChannelFactory");
if (channelFactoryProperty == null)
{
throw new InvalidOperationException(
"超时错误.");
}
ChannelFactory factory = (ChannelFactory)
channelFactoryProperty.GetValue(context.DomainClient, null);
factory.Endpoint.Binding.SendTimeout = sendTimeout;
}
channelFactoryProperty.GetValue(context.DomainClient, null);
factory.Endpoint.Binding.SendTimeout = sendTimeout;
}
然后在此类的 OnCreate 事件 中调用此方法设置超时时间 ,具体代码如下:
partial void OnCreated()
{
TimeSpan tenMinutes = new TimeSpan(0, 10, 0);
ChangeWcfSendTimeout(this, tenMinutes);
{
TimeSpan tenMinutes = new TimeSpan(0, 10, 0);
ChangeWcfSendTimeout(this, tenMinutes);
}
我这里设置的是十分钟