如何使用MSPL脚本检查邮件上是否存在自定义标头

时间:2017-09-08 09:37:47

标签: lync skype-for-business ucma

我正在使用以下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 'recording@example.com'!
            */

            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:recording@example.com";
                        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:recording@example.com");
                            return;
                        }
                        ProxyRequest(targetRequestUri);
                    }
                }
            }
]]></r:splScript>
</r:applicationManifest>

问题是UCMA应用程序接收来电,与受信任的参与者创建会议(因此可以记录),然后呼叫第二站并将呼叫加入会议。问题部分是调用第二条腿,因为这是由MSPL脚本拾取的,并且呼叫被定向到UCMA应用程序。这导致错误说

  

对于带有路径标题的请求,fork无效

当进行2段调用时,我使用下面的代码添加一个名为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应用程序?

1 个答案:

答案 0 :(得分:0)

您的代码对我来说没问题,我会尝试确定来自会议服务器的新INVITE是否有标题。

您可以: *使用Skype logging检查INVITE是否有例外标题。如果它没有,则表明DialOutAsync不正确。不确定我能帮忙解决这个问题。 *您可以使用MSPL Log命令来记录&#34; log&#34;调试信息以查看MSPL脚本的流动方式。

一些小型MSPL说明:

您不需要拨打#34; ProxyRequest&#34;。如果请求尚未重新定位或已经代理,则默认情况下会执行此操作。

我不确定你在使用&#34; QueryEndpoints&#34;打电话,它接缝就像你什么也没做,所以我会删除它。

我会将支持的方法限制为&#34; INVITE&#34;因为您不想重新定位其他请求类型。 例如

我只会重定向邀请而不是重新邀请。因此,您需要检查To标头是否包含&#34;标签&#34;参数。 e.g。

toTag = GetParameterValue(sipRequest.To, "tag");
if (toTag != null) {
    // This is a re-INVITE.
    return;
}

您应该过滤掉任何已经转发到重定位目标的INVITE ......

另一种选择是您可以过滤掉来自/来自电话会议的任何电话。 例如来自会议服务器:

opaqueTag = GetParameterValue(sipRequest.From, "opaque");
if (opaqueTag != null && ContainsString(opaqueTag, "app:conf:")) {
    // This is a conference call.
    return;
}

您应该能够找出To会议服务器呼叫。