Программно установить время ожидания WCF в режиме отладки

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

В режиме релиза тайм-ауты должны быть установлены на ~ 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, я должен не забыть сделать то же самое изменение в коде, чтобы убедиться, что поведение отладки аналогично поведению релиза (за исключением тайм-аутов..)

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

Ответ 1

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

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

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

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

Вы можете создать второе привязку в файле 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"

...