如何使用UCMA进行有人值守的呼叫转移

时间:2013-04-10 20:50:25

标签: ucma

我正在努力在我建立的UMCA IVR应用程序中进行呼叫转移。这不是使用Lync。

基本上,我有来自外部用户的既定呼叫,并且作为IVR应用程序的一部分,他们选择要转移的选项。此转移是配置的外部号码(即:我们的实时运营商)。我想要做的是将原始呼叫者转移到外部号码,如果建立了有效的转移,我想终止原始呼叫。如果未建立传输,我想将控制权发送回IVR应用程序以正常处理。

我的问题是我的EndTransferCall在建立传输时没有被击中。我本来期望它命中,设置我的AutoResetEvent并返回一个True,然后在我的应用程序中我可以断开原始调用。有人能告诉我我在这里缺少什么吗?

_call是已建立的AudioVideoCall。我的应用程序调用Transfer方法

private AutoResetEvent _waitForTransferComplete = new AutoResetEvent(false);

public override bool Transfer(string number, int retries = 3)
        {
            var success = false;
            var attempt = 0;

            CallTransferOptions transferOptions = new CallTransferOptions(CallTransferType.Attended);

            while ((attempt < retries) && (success == false))
            {
                try
                {
                    attempt++;

                    _call.BeginTransfer(number, transferOptions, EndTransferCall, null);

                    // Wait for the transfer to complete
                    _waitForTransferComplete.WaitOne();

                    success = true;
                }
                catch (Exception)
                {
                    //TODO: Log that the transfer failed
                    //TODO: Find out what exceptions get thrown and catch the specific ones
                }
            }

            return success;
        }

        private void EndTransferCall(IAsyncResult ar)
        {
            try
            {
                _call.EndTransfer(ar);
            }
            catch (OperationFailureException opFailEx)
            {
                Console.WriteLine(opFailEx.ToString());
            }
            catch (RealTimeException realTimeEx)
            {              
                Console.WriteLine(realTimeEx.ToString());
            }
            finally
            {
                _waitForTransferComplete.Set();
            }
        }

1 个答案:

答案 0 :(得分:0)

如果不使用_waitForTransferComplete对象,行为是否相同?你不应该需要它 - 方法结束应该没问题,事件仍然会被提出。如果您为了适应应用程序的其余部分而强制执行同步行为,请尝试这样:

_call.EndTransfer(
  _call.BeginTransfer (number,transferOptions,null,null)
   );

我只是想知道如果在单个线程或其他东西上运行,那么等待是否会导致问题......