Condividi tramite


Come controllare e gestire le chiamate con Automazione chiamate

L'automazione delle chiamate usa un'interfaccia API REST per ricevere richieste di azioni e fornire risposte per notificare se la richiesta è stata inviata o meno correttamente. A causa della natura asincrona della chiamata, la maggior parte delle azioni ha eventi corrispondenti che vengono attivati quando l'azione viene completata correttamente o ha esito negativo. Questa guida illustra le azioni disponibili per le chiamate di spostamento, ad esempio CreateCall, Transfer, Redirect e gestione dei partecipanti. Le azioni sono accompagnate da codice di esempio su come richiamare l'azione e i diagrammi di sequenza che descrivono gli eventi previsti dopo aver richiamato un'azione. Questi diagrammi consentono di visualizzare come programmare l'applicazione di servizio con Automazione chiamate.

L'automazione delle chiamate supporta varie altre azioni per gestire i supporti di chiamata e la registrazione con guide separate.

Come prerequisito, è consigliabile leggere questi articoli per sfruttare al meglio questa guida:

  1. Guida concettuale relativa all'automazione delle chiamate che descrive il modello di programmazione degli eventi action-event e i callback degli eventi.
  2. Informazioni sugli identificatori utente come CommunicationUserIdentifier e PhoneNumberIdentifier usati in questa guida.

Per tutti gli esempi di codice, client è l'oggetto CallAutomationClient che può essere creato come illustrato e callConnection è l'oggetto CallConnection ottenuto dalla risposta Answer o CreateCall. È anche possibile ottenerlo dagli eventi di callback ricevuti dall'applicazione.

var client = new CallAutomationClient("<resource_connection_string>"); 

Effettuare una chiamata in uscita

È possibile effettuare una chiamata individuale o di gruppo a un utente di comunicazione o a un numero di telefono (numero di proprietà di Servizi pubblici o di comunicazione). Quando si chiama un endpoint PSTN, è necessario specificare anche un numero di telefono usato come ID chiamante di origine e visualizzato nella notifica di chiamata all'endpoint PSTN di destinazione. Per effettuare una chiamata a un utente di Servizi di comunicazione, è necessario fornire un oggetto CommunicationUserIdentifier anziché PhoneNumberIdentifier.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events 
var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); // This is the Azure Communication Services provisioned phone number for the caller  
var callThisPerson = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber); // person to call
CreateCallResult response = await client.CreateCallAsync(callThisPerson, callbackUri);

Quando si effettua una chiamata di gruppo che include un numero di telefono, è necessario specificare un numero di telefono usato come numero ID chiamante all'endpoint PSTN.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events 
var pstnEndpoint = new PhoneNumberIdentifier("+16041234567");
var voipEndpoint = new CommunicationUserIdentifier("<user_id_of_target>"); //user id looks like 8:a1b1c1-...
var groupCallOptions = new CreateGroupCallOptions(new List<CommunicationIdentifier>{ pstnEndpoint, voipEndpoint }, callbackUri)
{
    SourceCallerIdNumber = new PhoneNumberIdentifier("+16044561234"), // This is the Azure Communication Services provisioned phone number for the caller
};
CreateCallResult response = await client.CreateGroupCallAsync(groupCallOptions);

La risposta fornisce l'oggetto CallConnection che è possibile usare per eseguire altre azioni su questa chiamata dopo la connessione. Dopo aver risposto alla chiamata, due eventi vengono pubblicati nell'endpoint di callback fornito in precedenza:

  1. Evento CallConnected che informa che la chiamata è stata stabilita con il chiamato.
  2. Evento ParticipantsUpdated che contiene l'elenco più recente di partecipanti nella chiamata. Diagramma di sequenza per l'inserimento di una chiamata in uscita.

Nel caso in cui la chiamata non riesca, si riceveranno eventi CallDisconnected e CreateCallFailed con codici di errore per ulteriori operazioni di risoluzione dei problemi. Vedere questa pagina per altre informazioni sui codici di errore di Automazione chiamata.

Connettersi a una chiamata (in anteprima)

L'azione di connessione consente al servizio di stabilire una connessione con una chiamata in corso e di eseguire azioni su di essa. Ciò è utile per gestire una chiamata Rooms o quando le applicazioni client hanno avviato una chiamata individuale o di gruppo di cui l'automazione delle chiamate non fa parte. La connessione viene stabilita usando la proprietà CallLocator e può essere di tipi: ServerCallLocator, GroupCallLocator e RoomCallLocator. Questi ID possono essere trovati quando la chiamata viene originariamente stabilita o viene creata una sala e pubblicata anche come parte di un evento CallStarted.

Per connettersi a qualsiasi chiamata di gruppo o individuale, usare ServerCallLocator. Se è stata avviata una chiamata usando GroupCallId, è anche possibile usare GroupCallLocator.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events
CallLocator serverCallLocator = new ServerCallLocator("<ServerCallId>");
ConnectCallResult response = await client.ConnectCallAsync(serverCallLocator, callbackUri);

Per connettersi a una chiamata Rooms, usare RoomCallLocator che accetta RoomId. Altre informazioni su Stanze e su come usare l'API di automazione delle chiamate per gestire le chiamate Stanze in corso.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events
CallLocator roomCallLocator = new RoomCallLocator("<RoomId>");
ConnectCallResult response = await client.ConnectCallAsync(roomCallLocator, callbackUri);

Una risposta con esito positivo fornisce un oggetto CallConnection che è possibile usare per eseguire altre azioni su questa chiamata. Due eventi vengono pubblicati nell'endpoint di callback fornito in precedenza:

  1. Evento CallConnected che informa che ci si connette correttamente alla chiamata.
  2. Evento ParticipantsUpdated che contiene l'elenco più recente di partecipanti nella chiamata.

In qualsiasi momento dopo una connessione riuscita, se il servizio viene disconnesso da questa chiamata, si riceverà una notifica tramite un evento CallDisconected. L'errore di connessione alla chiamata in primo luogo genera l'evento ConnectFailed.

Diagramma di sequenza per la connessione alla chiamata.

Rispondere a una chiamata in arrivo

Dopo aver effettuato la sottoscrizione per ricevere notifiche di chiamata in arrivo alla risorsa, si risponderà a una chiamata in arrivo. Quando si risponde a una chiamata, è necessario fornire un URL di callback. "Servizi di comunicazione" pubblica tutti gli eventi successivi relativi a questa chiamata a tale URL.

string incomingCallContext = "<IncomingCallContext_From_IncomingCall_Event>"; 
Uri callBackUri = new Uri("https://<myendpoint_where_I_want_to_receive_callback_events"); 

var answerCallOptions = new AnswerCallOptions(incomingCallContext, callBackUri);  
AnswerCallResult answerResponse = await client.AnswerCallAsync(answerCallOptions);
CallConnection callConnection = answerResponse.CallConnection; 

La risposta fornisce l'oggetto CallConnection che è possibile usare per eseguire altre azioni su questa chiamata dopo la connessione. Dopo aver risposto alla chiamata, due eventi vengono pubblicati nell'endpoint di callback fornito in precedenza:

  1. Evento CallConnected che informa che la chiamata è stata stabilita con il chiamante.
  2. Evento ParticipantsUpdated che contiene l'elenco più recente di partecipanti nella chiamata.

Diagramma di sequenza per rispondere a una chiamata in ingresso.

Rifiutare una chiamata

È possibile scegliere di rifiutare una chiamata in ingresso, come illustrato di seguito. È possibile specificare un motivo di rifiuto: nessuno, occupato o negato. Se non viene specificato alcun elemento, nessuna viene scelta per impostazione predefinita.

string incomingCallContext = "<IncomingCallContext_From_IncomingCall_Event>"; 
var rejectOption = new RejectCallOptions(incomingCallContext); 
rejectOption.CallRejectReason = CallRejectReason.Forbidden; 
_ = await client.RejectCallAsync(rejectOption); 

Nessun evento viene pubblicato per l'azione di rifiuto.

Reindirizzare una chiamata

È possibile scegliere di reindirizzare una chiamata in ingresso a un altro endpoint senza rispondere. Il reindirizzamento di una chiamata rimuove la capacità dell'applicazione di controllare la chiamata usando l'automazione delle chiamate.

string incomingCallContext = "<IncomingCallContext_From_IncomingCall_Event>"; 
var target = new CallInvite(new CommunicationUserIdentifier("<user_id_of_target>")); //user id looks like 8:a1b1c1-... 
_ = await client.RedirectCallAsync(incomingCallContext, target); 

Per reindirizzare la chiamata a un numero di telefono, costruire l'ID di destinazione e chiamante con PhoneNumberIdentifier.

var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); // This is the Azure Communication Services provisioned phone number for the caller
var target = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber);

Nessun evento viene pubblicato per il reindirizzamento. Se la destinazione è un utente di Servizi di comunicazione o un numero di telefono di proprietà della risorsa, genera un nuovo evento IncomingCall con il campo "to" impostato sulla destinazione specificata.

Trasferire un partecipante nella chiamata

Quando l'applicazione risponde a una chiamata o inserisce una chiamata in uscita a un endpoint, tale endpoint può essere trasferito a un altro endpoint di destinazione. Il trasferimento di una chiamata individuale rimuove l'applicazione dalla chiamata e quindi rimuove la possibilità di controllare la chiamata usando l'automazione delle chiamate. L'invito di chiamata alla destinazione visualizzerà l'ID chiamante dell'endpoint da trasferire. La fornitura di un ID chiamante personalizzato non è supportata.

var transferDestination = new CommunicationUserIdentifier("<user_id>"); 
var transferOption = new TransferToParticipantOptions(transferDestination) {
    OperationContext = "<Your_context>",
    OperationCallbackUri = new Uri("<uri_endpoint>") // Sending event to a non-default endpoint.
};
// adding customCallingContext
transferOption.CustomCallingContext.AddVoip("customVoipHeader1", "customVoipHeaderValue1");
transferOption.CustomCallingContext.AddVoip("customVoipHeader2", "customVoipHeaderValue2");

TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

Quando l'applicazione risponde a una chiamata di gruppo o inserisce una chiamata di gruppo in uscita a un endpoint o ha aggiunto un partecipante a una chiamata individuale, un endpoint può essere trasferito dalla chiamata a un altro endpoint di destinazione, ad eccezione dell'endpoint di automazione delle chiamate. Il trasferimento di un partecipante in una chiamata di gruppo rimuove l'endpoint trasferito dalla chiamata. L'invito di chiamata alla destinazione visualizzerà l'ID chiamante dell'endpoint da trasferire. La fornitura di un ID chiamante personalizzato non è supportata.

// Transfer User
var transferDestination = new CommunicationUserIdentifier("<user_id>");
var transferee = new CommunicationUserIdentifier("<transferee_user_id>"); 
var transferOption = new TransferToParticipantOptions(transferDestination);
transferOption.Transferee = transferee;

// adding customCallingContext
transferOption.CustomCallingContext.AddVoip("customVoipHeader1", "customVoipHeaderValue1");
transferOption.CustomCallingContext.AddVoip("customVoipHeader2", "customVoipHeaderValue2");

transferOption.OperationContext = "<Your_context>";
transferOption.OperationCallbackUri = new Uri("<uri_endpoint>");
TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

// Transfer PSTN User
var transferDestination = new PhoneNumberIdentifier("<target_phoneNumber>");
var transferee = new PhoneNumberIdentifier("<transferee_phoneNumber>"); 
var transferOption = new TransferToParticipantOptions(transferDestination);
transferOption.Transferee = transferee;

// adding customCallingContext
transferOption.CustomCallingContext.AddSipUui("uuivalue");
transferOption.CustomCallingContext.AddSipX("header1", "headerValue");

transferOption.OperationContext = "<Your_context>";

// Sending event to a non-default endpoint.
transferOption.OperationCallbackUri = new Uri("<uri_endpoint>");

TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

Il diagramma di sequenza mostra il flusso previsto quando l'applicazione effettua una chiamata in uscita e quindi la trasferisce a un altro endpoint.

Diagramma di sequenza per l'inserimento di una chiamata individuale e il suo trasferimento.

Aggiungere un partecipante a una chiamata

È possibile aggiungere un partecipante (utente o numero di telefono di Servizi di comunicazione) a una chiamata esistente. Quando si aggiunge un numero di telefono, è obbligatorio specificare un ID chiamante. Questo ID chiamante viene visualizzato nella notifica di chiamata al partecipante aggiunto.

// Add user
var addThisPerson = new CallInvite(new CommunicationUserIdentifier("<user_id>"));
// add custom calling context
addThisPerson.CustomCallingContext.AddVoip("myHeader", "myValue");
AddParticipantsResult result = await callConnection.AddParticipantAsync(addThisPerson);

// Add PSTN user
var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); // This is the Azure Communication Services provisioned phone number for the caller
var addThisPerson = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber);
// add custom calling context
addThisPerson.CustomCallingContext.AddSipUui("value");
addThisPerson.CustomCallingContext.AddSipX("header1", "customSipHeaderValue1");

// Use option bag to set optional parameters
var addParticipantOptions = new AddParticipantOptions(new CallInvite(addThisPerson))
{
    InvitationTimeoutInSeconds = 60,
    OperationContext = "operationContext",
    OperationCallbackUri = new Uri("uri_endpoint"); // Sending event to a non-default endpoint.
};

AddParticipantsResult result = await callConnection.AddParticipantAsync(addParticipantOptions); 

Per aggiungere un utente di Servizi di comunicazione, specificare CommunicationUserIdentifier anziché PhoneNumberIdentifier. L'ID chiamante non è obbligatorio in questo caso.

AddParticipant pubblica un evento AddParticipantSucceeded o AddParticipantFailed, assieme a ParticipantUpdated, che fornisce l'elenco più recente dei partecipanti nella chiamata.

Diagramma sequenza per l'aggiunta di un partecipante alla chiamata.

Annullare una richiesta di aggiunta partecipante

// add a participant
var addThisPerson = new CallInvite(new CommunicationUserIdentifier("<user_id>"));
var addParticipantResponse = await callConnection.AddParticipantAsync(addThisPerson);

// cancel the request with optional parameters
var cancelAddParticipantOperationOptions = new CancelAddParticipantOperationOptions(addParticipantResponse.Value.InvitationId)
{
    OperationContext = "operationContext",
    OperationCallbackUri = new Uri("uri_endpoint"); // Sending event to a non-default endpoint.
}
await callConnection.CancelAddParticipantOperationAsync(cancelAddParticipantOperationOptions);

Rimuovere un partecipante da una chiamata

var removeThisUser = new CommunicationUserIdentifier("<user_id>"); 

// remove a participant from the call with optional parameters
var removeParticipantOptions = new RemoveParticipantOptions(removeThisUser)
{
    OperationContext = "operationContext",
    OperationCallbackUri = new Uri("uri_endpoint"); // Sending event to a non-default endpoint.
}

RemoveParticipantsResult result = await callConnection.RemoveParticipantAsync(removeParticipantOptions);

RemoveParticipant pubblicherà un evento RemoveParticipantSucceeded o RemoveParticipantFailed, assieme a ParticipantUpdated che fornisce l'elenco più recente dei partecipanti nella chiamata. Il partecipante rimosso viene omesso dall'elenco.
Diagramma di sequenza per la rimozione di un partecipante dalla chiamata.

Interrompere una chiamata

L'azione Interrompi può essere usata per rimuovere l'applicazione dalla chiamata o per terminare una chiamata di gruppo impostando il parametro forEveryone su true. Per una chiamata individuale, l'azione Interrompi termina la chiamata con l'altro partecipante per impostazione predefinita.

_ = await callConnection.HangUpAsync(forEveryone: true); 

L'evento CallDisconnected viene pubblicato al termine dell'azione Interrompi.

Ottenere informazioni su un partecipante a una chiamata

CallParticipant participantInfo = await callConnection.GetParticipantAsync(new CommunicationUserIdentifier("<user_id>"));

Ottenere informazioni su tutti i partecipanti alle chiamate

List<CallParticipant> participantList = (await callConnection.GetParticipantsAsync()).Value.ToList(); 

Ottenere informazioni più recenti su una chiamata

CallConnectionProperties callConnectionProperties = await callConnection.GetCallConnectionPropertiesAsync();