Я создал простую настройку клиентского сервиса для загрузки приложений с сервера.Клиент создает NetNamedPipeBinding и использует его для открытия канала со службой, чтобы инициировать процесс загрузки.
private void OpenServiceChannel()
{
InstanceContext instanceContext = new InstanceContext(this);
NetNamedPipeBinding binding = new NetNamedPipeBinding();
DuplexChannelFactory<ICloudProductService> duplexChannelFactory = new DuplexChannelFactory<ICloudProductService>(instanceContext, binding, new EndpointAddress(ADDRESS));
_proxy = duplexChannelFactory.CreateChannel();
}
Затем служба использует Обратный вызов на том же канале, чтобы сообщить клиенту о ходе выполнения.Этот обратный вызов определен как часть ServiceContract:
[ServiceContract(CallbackContract = typeof(IStatusProgressCallback))]
public interface ICloudProductService
{
[OperationContract]
[FaultContract(typeof(ServiceErrorCode))]
Task<IEnumerable<LauncherAppDetails>> GetAvailableApps(string tokenJson);
[OperationContract]
[FaultContract(typeof(ServiceErrorCode))]
Task Install(string tokenJson, LauncherAppDetails app);
}
С событием в упомянутом обратном вызове, инициируемом Сервисом, когда ему необходимо увеличить прогресс загрузки
public interface IStatusProgressCallback
{
[OperationContract]
void OnProgressUpdated(InstallProgress progress);
}
Это все работаеткрасиво на любом наполовину приличном интернет-соединении, так как загрузка довольно быстрая.Моя проблема заключается в том, что при медленном соединении загрузка занимает больше времени, чем 1 минута по умолчанию для привязки.Я мог бы увеличить время ожидания этой привязки, но я обеспокоен тем, что это не идеальное решение, поскольку это плохая практика из-за возможных проблем безопасности / производительности.
Существует ли способ настройки привязки на стороне клиентатак, чтобы период ожидания обновлялся при каждом успешном обратном вызове (keep-alive), так что, пока сервер передает прогресс инкрементной загрузки, соединение не будет задерживаться.