Вызов IInteractionVoice.Release() не освобождает (вешает трубку) текущий вызов в пользовательском модуле Workspace Desktop Edition.
У меня есть требование, чтобы программно прервать текущий телефонный звонок в версии Genesys Workspace Desktop. Вот что у меня есть:
public class SomeService
{
private readonly IEnterpriseServiceProvider _esp;
public SomeService(IEnterpriseServiceProvider esp)
{
_esp = esp;
}
public void HangupCurrentCall()
{
var iv = _esp.Resolve<IInteractionVoice>();
iv.Release();
}
}
Приведенный выше код выполняется без ошибок, но вызов не прерывается.
1 ответ
Вы не можете повесить трубку только из корпоративного сервиса. WDE предоставляет API для этого. Вы можете проверить из документа руководства разработчика. На самом деле у вас есть два варианта для достижения этой цели. Первый способ с использованием командных вызовов WDE API. Второй способ использования универсального SDK (PSDK) для завершения текущего вызова. Прежде всего вам необходимо собрать идентификатор взаимодействия текущего вызова. После этого можете вызвать такую команду,
commandManager.CommandsByName["InteractionVoiceReleaseCall"].Insert(0, new CommandActivator()
{
CommandType = typeof(CustomCommand.ReleaseCall),
Name = "InteractionVoiceReleaseCall"
});
Вы можете найти список всех команд из руководства WDE API. В вашем типе команды (классе) вы должны вернуть логическое значение. Если вы вернете false, то можно продолжить, отправив true, как прервите команду.
Или вы можете напрямую выполнить команду, подобную этой;
IDictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("CommandParameter", interaction);
parameters.Add("Reasons", reasons);
parameters.Add("Extensions", extensions);
commandManager.GetChainOfCommandByName("InteractionVoiceReleaseCall").Execute();
Как разработчик, сертифицированный SDK, я всегда предпочитаю PSDK(универсальный Genesys SDK). Вы можете получить текущее соединение с сервером SIP и отправить запрос на него. Как этот блок кода
IChannelService channelService = agent.EntrepriseService.Resolve<IChannelService>("channelService");
IClientChannel tServerChannel = channelService.ListChannels<Genesyslab.Platform.Voice.Protocols.TServerProtocol>().FirstOrDefault();
channelService.RegisterEvents(tServerChannel, new Action<Genesyslab.Enterprise.Model.Channel.IClientChannel>(ChannelEvent));
TServerProtocol tServerProtocol = tServerChannel.Protocol as TServerProtocol;
После этого у вас есть текущее соединение с объектом tserverPorotocol. Затем вы можете отправить запрос на SIP-сервер.
Как это:
Genesyslab.Platform.Voice.Protocols.TServer.Requests.Voice.RequestReleaseCall releaseCall = Genesyslab.Platform.Voice.Protocols.TServer.Requests.Voice.RequestReleaseCall.Create();
releaseCall.ThisDN = "7000"; //(for example)(you can retrieve agent's DN from agent object)
releaseCall.ConnID = interaction.ConnectionId // you can retrieve from interactionhandler event.
tServerProtocol.Send(releaseCall);
//or tServerProtocol.Request(releaseCall); for async request. request return a ack message from the server.
Я пытался объяснить основы. Я надеюсь, что это полезно. Если у вас есть вопрос по поводу глотка или чего-либо еще, пожалуйста, дайте мне знать.