Программно установить время ожидания WCF в режиме отладки - PullRequest
10 голосов
/ 01 декабря 2009

Я использую WCF для связи между сервером и клиентом (оба написаны на C #).

В режиме релиза тайм-ауты должны быть установлены на ~ 20 секунд, но в режиме отладки я хочу установить для них более высокое значение, чтобы я мог отлаживать / выполнять мой код без истечения времени ожидания.

Я знаю, что могу изменить время ожидания, изменив файл app.config. Тем не менее, у меня есть две разные привязки и 4 значения времени ожидания в каждой, так что мне придется менять в нескольких местах, и это легко забыть.

Чтобы решить эту проблему, я хотел бы иметь в своем коде небольшой раздел #if DEBUG, который программно изменяет значения времени ожидания на 1 час.

Я попытался использовать следующий код для этого:

Configuration configuration = 
       ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ServiceModelSectionGroup serviceModel = 
       ServiceModelSectionGroup.GetSectionGroup(configuration); 

BindingsSection bindings = serviceModel.Bindings;

foreach (var configuredBinding in bindings.WSHttpBinding.ConfiguredBindings)
{
 configuredBinding.CloseTimeout = new TimeSpan(0, 30, 0);
 configuredBinding.OpenTimeout = new TimeSpan(0, 30, 0);

но свойства * Timeout доступны только для чтения, поэтому я получаю ошибку компиляции.

Мне не нравится идея программного создания привязок с нуля. Если я изменю некоторые атрибуты в app.config, я должен не забыть сделать то же самое изменение в коде, чтобы убедиться, что поведение отладки аналогично поведению релиза (за исключением времени ожидания ..)

Как с этим справиться?

Ответы [ 2 ]

13 голосов
/ 01 декабря 2009

Вы можете сделать следующее:

  • создать привязку и конечную точку в коде
  • установить время ожидания для экземпляра привязки
  • затем создайте свой клиентский прокси, используя эти два элемента

Что-то вроде:

BasicHttpBinding myBinding = new BasicHttpBinding("ConfigName");
myBinding.CloseTimeout = .......
myBinding.OpenTimeout = .......
myBinding.ReceiveTimeout = .......
myBinding.SendTimeout = .......

EndpointAddress myEndpoint = new EndpointAddress("http://server:8181/yourservice");

YourServiceClient proxy = new YourServiceClient(myBinding, myEndpoint);

Таким образом, вы можете использовать базовую конфигурацию при описании тайм-аутов привязки, и в то же время вы можете настроить нужные параметры и создать из них клиентский прокси.

2 голосов
/ 19 января 2010

Вы можете создать вторую привязку в web.config и установить более длинный sendTimeout.

        if (debug)
        {
            proxy =  new MyClient("WSHttpBinding_MyLocal");
        }
        else
        {
            proxy = new MyClient("WSHttpBinding_MyDev");
        }

        <wsHttpBinding>
            <binding name="WSHttpBinding_MyLocal" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:20:00"

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...