我正在使用以下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应用程序?
答案 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会议服务器呼叫。