基于托管 SIP 应用程序 API 构建的第二个 Lync 应用程序未接收 SIP 消息

Posted

技术标签:

【中文标题】基于托管 SIP 应用程序 API 构建的第二个 Lync 应用程序未接收 SIP 消息【英文标题】:Second Lync application built on Managed SIP Application API is not receiving SIP messages 【发布时间】:2014-06-30 07:57:01 【问题描述】:

我们希望在同一前端服务器上运行两次基于托管 SIP 应用程序 API 构建的相同应用程序。它们使用相同的名称、相同的 MSPL 脚本和相同的代码,只是它们的配置 (.config) 略有不同。

我们启动的第一个实例工作正常并且正在接收 SIP 消息,但是一旦第二个实例启动,第一个实例就不再接收任何 SIP 消息,现在只有第二个实例正在接收 SIP 消息。我们希望我们的两个实例都能处理到目前为止我们未能成功的所有 SIP 消息。

我们用来发送 SIP 消息的 MSPL 脚本是:

<?xml version="1.0"?>
<r:applicationManifest
 r:appUri="http://example.com/ProgramName"
 xmlns:r="http://schemas.microsoft.com/lcs/2006/05">

  <!-- Handle incoming requests to Lync server -->
  <r:requestFilter methodNames="ALL"
                   strictRoute="true"
                   registrarGenerated="true"
                   domainSupported="true"/>

  <!-- Handle outgoing requests to Lync server-->
  <r:responseFilter reasonCodes="ALL"/>

  <r:splScript>
    <![CDATA[

if (sipRequest)

  //Ignoring benotify events.
  if(sipRequest.Method =="BENOTIFY")
  
    return;
  

  Dispatch("OnRequest");

else

  Dispatch("OnResponse");


]]>
  </r:splScript>
</r:applicationManifest>

由以下 OnRequest 和 OnResponse 消息处理:

public void OnRequest(object sender, RequestReceivedEventArgs evt)

  // Do some stuff with evt.Message

  evt.ServerTransaction.EnableForking = false;
  evt.ServerTransaction.CreateBranch().SendRequest(message.Message as Request);


public void OnResponse(object sender, ResponseReceivedEventArgs evt)

  // Do some stuff with evt.Message

  evt.ClientTransaction.ServerTransaction.SendResponse(message.Message as Response);

以下是这些程序如何注册为服务器应用程序(Get-CsServerApplication 的输出):

Identity   : Service:Registrar:FQDN/ExampleProgramName
Priority   : 12
Uri        : http://example.com/ProgramName
Name       : ExampleProgramName
Enabled    : True
Critical   : False
ScriptName : 
Script     : 

Identity   : Service:Registrar:FQDN/ExampleProgramName
Priority   : 13
Uri        : http://example.com/ProgramName
Name       : ExampleProgramName
Enabled    : True
Critical   : False
ScriptName : 
Script     : 

我们还尝试以不同的名称注册同一个应用程序。例如,我们在 MSPL 脚本和 New-CsServerApplication 中将两个实例之一重命名为 ExampleProgramName2,但也不起作用。

特别是,我们不确定 MSPL 脚本中的 requestFilter 和特定的 SendResponse/SendRequest 方法调用以及 EnableForking 属性。

【问题讨论】:

【参考方案1】:

使用不同的名称注册服务器应用程序:

New-CsServerApplication -Identity FQDN/ExampleProgramName1 -Uri http://example.com/ProgramName1 -Critical $False
New-CsServerApplication -Identity FQDN/ExampleProgramName2 -Uri http://example.com/ProgramName2 -Critical $False

以及为每个程序在 MSPL 中的唯一名称与 New-CsServerApplication 的 Uri 参数中给出的值匹配:

<r:applicationManifest
  r:appUri="http://example.com/ProgramName1"

<r:applicationManifest
  r:appUri="http://example.com/ProgramName2"

这应该足够了。

【讨论】:

以上是关于基于托管 SIP 应用程序 API 构建的第二个 Lync 应用程序未接收 SIP 消息的主要内容,如果未能解决你的问题,请参考以下文章

托管基于 Java 的 REST API 服务

基于子数组的第二个元素对多维数组进行排序

基于 Ionic 3 中的第一个 DropDownSelect 显示/隐藏第二个 DropDownSelect

Exosip分析

如何使用标题中的两个参数和正文中的第二个参数从另一个 MVC 项目调用 Web API

在托管对象上下文之间传递对象