你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何在呼叫之间传递上下文数据

通话自动化允许开发人员在路由呼叫时传递自定义上下文信息。 开发人员可以传递有关呼叫、被叫方或任何其他与应用程序或业务逻辑相关的信息的元数据。 这样,企业就可以跨网络管理和路由呼叫,而无需担心丢失上下文。

传递上下文是通过指定自定义标头来支持的。 这些是可包含在 AddParticipantTransfer 操作中的键值对的可选列表。 上下文稍后可以作为 IncomingCall 事件有效负载的一部分进行检索。

自定义呼叫上下文也会转发到 SIP 协议,其中包括自由格式的自定义标头以及标准的用户到用户信息 (UUI) SIP 标头。 从电话网络路由入站呼叫时,自定义标头和 UUI 中 SBC 的数据集同样包含在 IncomingCall 事件有效负载中。

所有自定义上下文数据对于通话自动化或 SIP 协议都是不透明的,并且其内容与任何基本功能都无关。

下面是有关如何开始在通话自动化中使用自定义上下文标头的示例。

作为先决条件,我们建议阅读以下文章以充分理解本指南:

  • 介绍操作事件编程模型和事件回调的通话自动化概念指南
  • 了解本指南中使用的用户标识符,例如 CommunicationUserIdentifier 和 PhoneNumberIdentifier。

对于所有代码示例,client 是可以按示例所示创建的 CallAutomationClient 对象,callConnection 是从 Answer 或 CreateCall 响应中获取的 CallConnection 对象。 也可以从应用程序收到的回调事件中获取该对象。

技术参数

通话自动化最多支持 5 个自定义 SIP 标头和 1000 个自定义 VOIP 标头。 此外,开发人员还可以将专用的用户到用户标头作为 SIP 标头列表的一部分。

自定义 SIP 标头键必须以必需的 ‘X-MS-Custom-’ 前缀开头。 SIP 标头键的最大长度为 64 个字符,包括 X-MS-Custom 前缀。 SIP 标头键可由字母数字字符和一些选定的符号组成,包括 .!%*_+~-。 SIP 标头值的最大长度为 256 个字符。 在 SBC 上配置 SIP 标头时,同样的限制适用。 SIP 标头值可由字母数字字符和一些选定的符号组成,包括 =;.!%*_+~-

VOIP 标头键的最大长度为 64 个字符。 可以在不带 ‘x-MS-Custom’ 前缀的情况下发送这些标头。 VOIP 标头值的最大长度为 1024 个字符。

邀请参与者时添加自定义上下文

// Invite a communication services user and include one VOIP header
var addThisPerson = new CallInvite(new CommunicationUserIdentifier("<user_id>"));
addThisPerson.CustomCallingContext.AddVoip("myHeader", "myValue");
AddParticipantsResult result = await callConnection.AddParticipantAsync(addThisPerson);
// Invite a PSTN user and set UUI and custom SIP headers
var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); 
var addThisPerson = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber);

// Set custom UUI header. This key is sent on SIP protocol as User-to-User
addThisPerson.CustomCallingContext.AddSipUui("value");

// This provided key will be automatically prefixed with X-MS-Custom on SIP protocol, such as 'X-MS-Custom-{key}'
addThisPerson.CustomCallingContext.AddSipX("header1", "customSipHeaderValue1");
AddParticipantsResult result = await callConnection.AddParticipantAsync(addThisPerson);

在呼叫转移期间添加自定义上下文

//Transfer to communication services user and include one VOIP header
var transferDestination = new CommunicationUserIdentifier("<user_id>"); 
var transferOption = new TransferToParticipantOptions(transferDestination);   
var transferOption = new TransferToParticipantOptions(transferDestination) {
    OperationContext = "<Your_context>",
    OperationCallbackUri = new Uri("<uri_endpoint>") // Sending event to a non-default endpoint.
};
transferOption.CustomCallingContext.AddVoip("customVoipHeader1", "customVoipHeaderValue1");
TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

//Transfer a PSTN call to phone number and set UUI and custom SIP headers
var transferDestination = new PhoneNumberIdentifier("<target_phoneNumber>");
var transferOption = new TransferToParticipantOptions(transferDestination);
transferOption.CustomCallingContext.AddSipUui("uuivalue");
transferOption.CustomCallingContext.AddSipX("header1", "headerValue");
TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption)

从传入呼叫事件读取自定义上下文

AcsIncomingCallEventData incomingEvent = <incoming call event from Event Grid>;
// Retrieve incoming call custom context
AcsIncomingCallCustomContext callCustomContext = incomingEvent.CustomContext;

// Inspect dictionary with key/value pairs
var voipHeaders = callCustomContext.VoipHeaders;
var sipHeaders = callCustomContext.SipHeaders;

// Get SIP UUI header value
var userToUser = sipHeaders["user-To-User"]

// Proceed to answer or reject call as usual

其他资源