Я использую следующий сценарий 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?