Программно установить время ожидания 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"
...