Вызов 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.

Я пытался объяснить основы. Я надеюсь, что это полезно. Если у вас есть вопрос по поводу глотка или чего-либо еще, пожалуйста, дайте мне знать.

Другие вопросы по тегам