Как проверить наличие настраиваемого заголовка в сообщении с помощью сценария MSPL

Я использую следующий сценарий MSPL для направления аудиозвонков в приложение UCMA.

<?xml version="1.0" encoding="utf-8"?>
<r:applicationManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" r:appUri="http://www.example.com/recording" xmlns:r="http://schemas.microsoft.com/lcs/2006/05">
  <r:requestFilter methodNames="ALL" strictRoute="true" registrarGenerated="true" domainSupported="true" />
  <r:allowRegistrationBeforeUserServices action="true" />
  <r:responseFilter reasonCodes="NONE" />
  <r:proxyByDefault action="true" />
  <r:scriptOnly />
  <r:splScript><![CDATA[ 
            /* 
                This script has been generated by SimpleRoute. Changes to this file may cause unexpected behavior.
                -
                -
                -
                All audio calls from any origin
                are redirected to '[email protected]'!
            */

            function InviteHasBody()
            {
                foreach(header in GetHeaderValues(StandardHeader.ContentType))
                {
                    /* Found a content-type header, so we know it has a body. */
                    return true;
                }
                return false;
            }

            function IsAudioCall()
            {
                if((sipRequest.Method == "INVITE") && (!InviteHasBody() || ContainsString(sipRequest.Content,"\nm=audio ", false) || ContainsString(sipRequest.Content,"\rm=audio ", false)))
                {
                    return true;
                }
                return false;
            }

            function IgnoreCall()
            {
                foreach(header in GetHeaderValues("IgnoreCall"))
                {
                    /* Found ignore call. */
                    return true;
                }
                return false;
            }

            if (sipRequest)
            {
                if(IsAudioCall())
                {
                    if (!IgnoreCall())
                    {
                        targetUser = "sip:[email protected]";
                        userAtHost =  GetUserAtHost(targetUser);
                        targetRequestUri = "";
                        foreach(dbEndpoint in QueryEndpoints(userAtHost, true))
                        {
                            targetEpid = dbEndpoint.EPID;
                            targetRequestUri = dbEndpoint.ContactInfo;
                            if(targetRequestUri != "" && targetRequestUri != null)
                                break;
                        }

                        if(targetRequestUri == "")
                        {
                            RetargetRequest("sip:[email protected]");
                            return;
                        }
                        ProxyRequest(targetRequestUri);
                    }
                }
            }
]]></r:splScript>
</r:applicationManifest>

Проблема заключается в том, что приложение UCMA принимает входящий вызов, создает конференцию с доверенным участником (чтобы ее можно было записать), а затем вызывает вторую ветвь и присоединяет вызов к конференции. Проблемной частью является вызов второй ветви, поскольку она перехватывается сценарием MSPL, и вызов направляется в приложение UCMA. Это вызывает ошибку, говоря

Недопустимая вилка для запроса с заголовками маршрута

Когда выполняется двухэлементный вызов, я добавляю настраиваемый заголовок под названием IgnoreCall, используя приведенный ниже код.

McuDialOutOptions mcuDialOutOptions = new McuDialOutOptions();
mcuDialOutOptions.ParticipantUri = destinationUri;
mcuDialOutOptions.Headers.Add(new SignalingHeader("IgnoreCall", "true"));
_incomingAudioVideoCall.Conversation.ConferenceSession.AudioVideoMcuSession.DialOutAsync(destinationUri, mcuDialOutOptions);

Это сделано для того, чтобы сценарий MSPL мог проверить, следует ли направлять вызов в приложение UCMA. Но сценарий MSPL не обнаруживает, что сообщение / вызов имеет заголовок IgnoreCall.

Может ли кто-нибудь сказать мне, как лучше всего проверить, содержит ли сообщение / вызов заголовок IgnoreCall, чтобы я знал, когда не следует направлять сообщение / вызов в приложение UCMA?


person m_collard    schedule 08.09.2017    source источник