Настройка времени ожидания для вызова службы WCF RIA из клиента Silverlight 3 - PullRequest
2 голосов
/ 16 декабря 2009

Я использую WCF RIA Services Beta с Silverlight 3.0 и хочу настроить время ожидания от клиента. Я знаю, что базовой технологией является WCF, и время ожидания по умолчанию составляет 60 секунд, как я и ожидал.

Есть ли простой способ контролировать эту и другие настройки WCF?

Моя первая мысль - попробовать точку подключения DomainContext OnCreated , которая была упомянута в PDF Обзоре услуг RIA pdf, который был доступен до запуска RIA Services бета. В документации MSDN для объекта DomainContext метод больше не упоминается, хотя он все еще там? Я не уверен, является ли это причиной отставания документации или указанием на то, что мне не следует использовать эту точку расширения.

namespace Example.UI.Web.Services
{
    public sealed partial class CustomDomainContext
    {
        partial void OnCreated()
        {
            // Try and get hold of the WCF config from here
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 03 июля 2010

http://blogs.objectsharp.com/CS/blogs/dan/archive/2010/03/22/changing-timeouts-in-wcf-ria-services-rc.aspx

Любая строка после создания контекста домена:

((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 голос
/ 16 декабря 2009

Для справки код ниже почти работает, но вы не можете получить доступ к приватному члену, используя отражение в Silverlight. В любом случае, не был бы счастлив с этим взломом . Интересно отметить, что существует конструктор WebDomainClient, который принимает параметр Binding private WebDomainClient(Uri serviceUri, bool usesHttps, Binding binding), но XML-комментарий для этого состояния Закрытый конструктор. Должен быть обнародован, как только у нас появится сквозная история расширяемости поверх 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);
    }
}
...