Jak przekazywać dane kontekstowe między wywołaniami
Artykuł
Usługa Call Automation umożliwia deweloperom przekazywanie niestandardowych informacji kontekstowych podczas routingu wywołań. Deweloperzy mogą przekazywać metadane dotyczące wywołania, wywoływania lub innych informacji, które są istotne dla ich aplikacji lub logiki biznesowej. Dzięki temu firmy mogą zarządzać i kierować połączenia między sieciami bez konieczności martwienia się o utratę kontekstu.
Przekazywanie kontekstu jest obsługiwane przez określenie nagłówków niestandardowych. Są to opcjonalna lista par klucz-wartość, które można uwzględnić w ramach AddParticipant akcji lub Transfer . Kontekst można później pobrać jako część ładunku IncomingCall zdarzenia.
Niestandardowy kontekst wywołania jest również przekazywany do protokołu SIP. Obejmuje to zarówno nagłówki niestandardowe freeform, jak i standardowy nagłówek SIP user-to-User Information (UUI). Podczas routingu wywołania przychodzącego z sieci telefonii zestaw danych z SBC w nagłówkach niestandardowych i interfejsie użytkownika jest podobnie uwzględniony w ładunku IncomingCall zdarzenia.
Wszystkie niestandardowe dane kontekstowe są nieprzezroczyste do protokołów Call Automation lub SIP, a jego zawartość nie jest powiązana z żadnymi podstawowymi funkcjami.
Poniżej przedstawiono przykłady dotyczące rozpoczynania pracy z niestandardowymi nagłówkami kontekstu w usłudze Call Automation.
W ramach wymagań wstępnych zalecamy przeczytanie tych artykułów, aby jak najlepiej wykorzystać ten przewodnik:
Dowiedz się więcej o identyfikatorach użytkowników, takich jak CommunicationUserIdentifier i Telefon NumberIdentifier używanych w tym przewodniku.
Dla wszystkich przykładów kodu jest obiekt CallAutomationClient, client który można utworzyć, jak pokazano i callConnection jest obiektem Call Połączenie ion uzyskanym z odpowiedzi Answer lub CreateCall. Można go również uzyskać z zdarzeń wywołania zwrotnego odebranych przez aplikację.
Parametry techniczne
Usługa Call Automation obsługuje maksymalnie 5 niestandardowych nagłówków SIP i 1000 niestandardowych nagłówków VOIP. Ponadto deweloperzy mogą dołączać dedykowany nagłówek User-To-User jako część listy nagłówków SIP.
Niestandardowy klucz nagłówka SIP musi zaczynać się od obowiązkowego prefiksu "X-MS-Custom-". Maksymalna długość klucza nagłówka SIP wynosi 64 znaki, w tym prefiks X-MS-Custom. Klucz nagłówka SIP może składać się z znaków alfanumerycznych i kilku wybranych symboli, w tym ., , _!~%+*-. Maksymalna długość wartości nagłówka SIP wynosi 256 znaków. Te same ograniczenia mają zastosowanie podczas konfigurowania nagłówków SIP na SBC. Wartość nagłówka SIP może składać się z znaków alfanumerycznych i kilku wybranych symboli, które obejmują =, , ;, *%+!_., . ~-
Maksymalna długość klucza nagłówka VOIP wynosi 64 znaki. Te nagłówki można wysyłać bez prefiksu "x-MS-Custom". Maksymalna długość wartości nagłówka VOIP to 1024 znaki.
Dodawanie kontekstu niestandardowego podczas zapraszania uczestnika
// 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);
// Invite a communication services user and include one VOIP header
CallInvite callInvite = new CallInvite(new CommunicationUserIdentifier("<user_id>"));
callInvite.getCustomCallingContext().addVoip("voipHeaderName", "voipHeaderValue");
AddParticipantOptions addParticipantOptions = new AddParticipantOptions(callInvite);
Response<AddParticipantResult> addParticipantResultResponse = callConnectionAsync.addParticipantWithResponse(addParticipantOptions).block();
// Invite a PSTN user and set UUI and custom SIP headers
PhoneNumberIdentifier callerIdNumber = new PhoneNumberIdentifier("+16044561234");
CallInvite callInvite = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber);
callInvite.getCustomCallingContext().addSipUui("value");
callInvite.getCustomCallingContext().addSipX("header1", "customSipHeaderValue1");
AddParticipantOptions addParticipantOptions = new AddParticipantOptions(callInvite);
Response<AddParticipantResult> addParticipantResultResponse = callConnectionAsync.addParticipantWithResponse(addParticipantOptions).block();
// Invite a communication services user and include one VOIP header
const customCallingContext: CustomCallingContext = [];
customCallingContext.push({ kind: "voip", key: "voipHeaderName", value: "voipHeaderValue" })
const addThisPerson = {
targetParticipant: { communicationUserId: "<acs_user_id>" },
customCallingContext: customCallingContext,
};
const addParticipantResult = await callConnection.addParticipant(addThisPerson);
// Invite a PSTN user and set UUI and custom SIP headers
const callerIdNumber = { phoneNumber: "+16044561234" };
const customCallingContext: CustomCallingContext = [];
customCallingContext.push({ kind: "sipuui", key: "", value: "value" });
customCallingContext.push({ kind: "sipx", key: "headerName", value: "headerValue" })
const addThisPerson = {
targetParticipant: { phoneNumber: "+16041234567" },
sourceCallIdNumber: callerIdNumber,
customCallingContext: customCallingContext,
};
const addParticipantResult = await callConnection.addParticipant(addThisPerson);
#Invite a communication services user and include one VOIP header
voip_headers = {"voipHeaderName", "voipHeaderValue"}
target = CommunicationUserIdentifier("<acs_user_id>")
result = call_connection_client.add_participant(
target,
voip_headers=voip_headers
)
#Invite a PSTN user and set UUI and custom SIP headers
caller_id_number = PhoneNumberIdentifier("+16044561234")
sip_headers = {}
sip_headers["User-To-User"] = "value"
sip_headers["X-MS-Custom-headerName"] = "headerValue"
target = PhoneNumberIdentifier("+16041234567")
result = call_connection_client.add_participant(
target,
sip_headers=sip_headers,
source_caller_id_number=caller_id_number
)
Dodawanie kontekstu niestandardowego podczas transferu połączeń
//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)
//Transfer to communication services user and include one VOIP header
CommunicationIdentifier transferDestination = new CommunicationUserIdentifier("<user_id>");
TransferCallToParticipantOptions options = new TransferCallToParticipantOptions(transferDestination);
options.getCustomCallingContext().addVoip("voipHeaderName", "voipHeaderValue");
Response<TransferCallResult> transferResponse = callConnectionAsync.transferToParticipantCallWithResponse(options).block();
//Transfer a PSTN call to phone number and set UUI and custom SIP headers
CommunicationIdentifier transferDestination = new PhoneNumberIdentifier("<taget_phoneNumber>");
TransferCallToParticipantOptions options = new TransferCallToParticipantOptions(transferDestination);
options.getCustomCallingContext().addSipUui("UUIvalue");
options.getCustomCallingContext().addSipX("sipHeaderName", "value");
Response<TransferCallResult> transferResponse = callConnectionAsync.transferToParticipantCallWithResponse(options).block();
//Transfer to communication services user and include one VOIP header
const transferDestination = { communicationUserId: "<user_id>" };
const transferee = { communicationUserId: "<transferee_user_id>" };
const options = { transferee: transferee, operationContext: "<Your_context>", operationCallbackUrl: "<url_endpoint>" };
const customCallingContext: CustomCallingContext = [];
customCallingContext.push({ kind: "voip", key: "customVoipHeader1", value: "customVoipHeaderValue1" })
options.customCallingContext = customCallingContext;
const result = await callConnection.transferCallToParticipant(transferDestination, options);
//Transfer a PSTN call to phone number and set UUI and custom SIP headers
const transferDestination = { phoneNumber: "<taget_phoneNumber>" };
const transferee = { phoneNumber: "<transferee_phoneNumber>" };
const options = { transferee: transferee, operationContext: "<Your_context>", operationCallbackUrl: "<url_endpoint>" };
const customCallingContext: CustomCallingContext = [];
customCallingContext.push({ kind: "sipuui", key: "", value: "uuivalue" });
customCallingContext.push({ kind: "sipx", key: "headerName", value: "headerValue" })
options.customCallingContext = customCallingContext;
const result = await callConnection.transferCallToParticipant(transferDestination, options);
#Transfer to communication services user and include one VOIP header
transfer_destination = CommunicationUserIdentifier("<user_id>")
transferee = CommnunicationUserIdentifer("transferee_user_id")
voip_headers = {"customVoipHeader1", "customVoipHeaderValue1"}
result = call_connection_client.transfer_call_to_participant(
target_participant=transfer_destination,
transferee=transferee,
voip_headers=voip_headers,
opration_context="Your context",
operationCallbackUrl="<url_endpoint>"
)
#Transfer a PSTN call to phone number and set UUI and custom SIP headers
transfer_destination = PhoneNumberIdentifer("<target_phoneNumber>")
transferee = PhoneNumberIdentifer("transferee_phoneNumber")
sip_headers={}
sip_headers["X-MS-Custom-headerName"] = "headerValue"
sip_headers["User-To-User"] = "uuivalue"
result = call_connection_client.transfer_call_to_participant(
target_participant=transfer_destination,
transferee=transferee,
sip_headers=sip_headers,
opration_context="Your context",
operationCallbackUrl="<url_endpoint>"
)
Transfer połączenia VoIP na numer telefonu nie jest obecnie obsługiwany.
Odczytywanie kontekstu niestandardowego ze zdarzenia połączenia przychodzącego