2010-11-11 5 views
2

У меня есть пользовательский элемент управления Silverlight 4, который вызывает очень длинную службу WCF RIA. Как показано ниже, я увеличиваю период ожидания по умолчанию.Silverlight 4 WCF RIA Service Timeout Problem

_domainContext = new WindowsDashboardDomainContext(); 
// Increase timeout -- this can be a very long running query 
((WebDomainClient<WindowsDashboardDomainContext.IWindowsDashboardDomainServiceContract>) 
_domainContext.DomainClient).ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan(99, 0, 0); 
    _domainContext.GetSections("All", "All", "All").Completed += GetAllSectionsCompleted; 

К сожалению, это, кажется, игнорирует этот тайм-аут, и по-прежнему бросает исключение тайм-аут:

Error: Unhandled Error in Silverlight Application Load operation failed for query 'GetClicks'. An error occurred while executing the command definition. See the inner exception for details. Inner exception message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

Почему это происходит?

ответ

1

Есть две возможности, которые приходят на ум:

  1. Вы не настроили DomainService на serilalize достаточного количества объектов. По умолчанию очень мало. Попробуйте this tip Я поставил вчера, чтобы увеличить выделение результатов
  2. Ваш источник данных может быть отключен. В этом случае вам необходимо увеличить тайм-аут команды для LINQ to SQL, EF или ADO.NET соответственно. Это менее вероятная причина, но ее следует учитывать.
2

Я ответил тот же вопрос здесь: WCF ria service SP1 timeout expired

Ответ:

Я объясню свой контекст, и я хочу это будет работать на моей. Я в этом уверен.

Прежде всего, чтобы позвонить RIA услуг, а также используя некоторый контекст домена, в моем примере:

EmployeeDomainContext context = new EmployeeDomainContext(); 
InvokeOperation<bool> invokeOperation = context.GenerateTMEAccessByEmployee(1, 'Bob'); 
invokeOperation.Completed += (s, x) => 
    {....}; 

ничего нового, пока здесь. И с этим я столкнулся каждый раз с тем же самым тайм-аутом через 1 минуту. Я трачу довольно много времени, пытаясь понять, как изменить определение тайм-аута, я пробовал все возможные изменения в Web.config и ничего. Раствор:

Создать CustomEmployeeDomainContext, то есть частичный класс localizated в том же пути генерируемого кода и этот класс использовать метод OnCreate крюк, чтобы изменить поведение созданного контекста домена. В этом классе вы должны написать:

public partial class EmployeeDomainContext : DomainContext 
{ 
    partial void OnCreated() 
    { 
     PropertyInfo channelFactoryProperty = this.DomainClient.GetType().GetProperty("ChannelFactory"); 
     if (channelFactoryProperty == null) 
     { 
      throw new InvalidOperationException(
       "There is no 'ChannelFactory' property on the DomainClient."); 
     } 

     ChannelFactory factory = (ChannelFactory)channelFactoryProperty.GetValue(this.DomainClient, null); 

     factory.Endpoint.Binding.SendTimeout = new TimeSpan(0, 10, 0); 

    } 
} 

Я с нетерпением жду ваших отзывов.