Scenario: Gestione delle eccezioni e registrazione degli errori per le app per la logicaScenario: Exception handling and error logging for logic apps

Questo scenario descrive come è possibile estendere un'app per la logica per supportare al meglio la gestione delle eccezioni.This scenario describes how you can extend a logic app to better support exception handling. Si tratta di un caso d'uso reale che risponde alla domanda "Le app per la logica di Azure supportano la gestione di errori ed eccezioni?".We've used a real-life use case to answer the question: "Does Azure Logic Apps support exception and error handling?"

Nota

Lo schema corrente delle app per la logica di Azure offre un modello standard per le risposte alle azioni,The current Azure Logic Apps schema provides a standard template for action responses. che include le risposte per gli errori e la convalida interna restituite da un'app per le API.This template includes both internal validation and error responses returned from an API app.

Panoramica su scenario e caso d'usoScenario and use case overview

Questa è la storia riportata nel caso d'uso per lo scenario:Here's the story as the use case for this scenario:

Una nota organizzazione sanitaria ha richiesto lo sviluppo di una soluzione di Azure per creare un portale per i pazienti con Microsoft Dynamics CRM Online,A well-known healthcare organization engaged us to develop an Azure solution that would create a patient portal by using Microsoft Dynamics CRM Online. con invio dei record degli appuntamenti tra il portale per i pazienti Dynamics CRM Online e Salesforce.They needed to send appointment records between the Dynamics CRM Online patient portal and Salesforce. È stato richiesto di usare lo standard HL7 FHIR per tutti i record dei pazienti.We were asked to use the HL7 FHIR standard for all patient records.

Il progetto prevedeva due requisiti principali:The project had two major requirements:

  • Un metodo per registrare i record inviati dal portale Dynamics CRM OnlineA method to log records sent from the Dynamics CRM Online portal
  • Un modo per visualizzare gli eventuali errori verificatisi nel flusso di lavoroA way to view any errors that occurred within the workflow

Suggerimento

Per un video generale su questo progetto, vedere il sito Web Integration User Group.For a high-level video about this project, see Integration User Group.

Come è stato risolto il problemaHow we solved the problem

Come repository per i record di log e di errore è stato scelto Azure Cosmos DB, in cui i record sono definiti documenti.We chose Azure Cosmos DB As a repository for the log and error records (Cosmos DB refers to records as documents). Dato che le app per la logica di Azure includono un modello standard per tutte le risposte, non è stato necessario creare uno schema personalizzato.Because Azure Logic Apps has a standard template for all responses, we would not have to create a custom schema. È stato possibile creare un'app per le API per l'inserimento e la query per i record di errore e di log.We could create an API app to Insert and Query for both error and log records. È stato anche possibile definire uno schema per ognuno all'interno dell'app per le API.We could also define a schema for each within the API app.

Un altro requisito era ripulire i record dopo una certa data.Another requirement was to purge records after a certain date. Cosmos DB include una proprietà denominata durata (TTL) che ha consentito di impostare un valore di durata (TTL) per ogni record o raccolta.Cosmos DB has a property called Time to Live (TTL), which allowed us to set a Time to Live value for each record or collection. Questa funzionalità ha evitato di dover eliminare manualmente i record in Cosmos DB.This capability eliminated the need to manually delete records in Cosmos DB.

Importante

Per completare questa esercitazione, è necessario creare un database Cosmos DB e due raccolte, per la registrazione e gli errori.To complete this tutorial, you need to create a Cosmos DB database and two collections (Logging and Errors).

Creare l'app per la logicaCreate the logic app

Il primo passaggio consiste nel creare l'app per la logica e aprirla nella finestra di progettazione di app per la logica.The first step is to create the logic app and open the app in Logic App Designer. In questo esempio vengono usate app per la logica padre-figlio.In this example, we are using parent-child logic apps. Partendo dal presupposto di aver già creato l'elemento padre, si procederà alla creazione di un'app per la logica figlio.Let's assume that we have already created the parent and are going to create one child logic app.

Dato che si prevede di registrare il record proveniente da Dynamics CRM Online, si inizierà dal principio.Because we are going to log the record coming out of Dynamics CRM Online, let's start at the top. È necessario usare un trigger di richiesta, perché l'app per la logica padre attiva questo elemento figlio.We must use a Request trigger because the parent logic app triggers this child.

Trigger dell'app per la logicaLogic app trigger

Viene usato un trigger di richiesta come illustrato nell'esempio seguente:We are using a Request trigger as shown in the following example:

"triggers": {
        "request": {
          "type": "request",
          "kind": "http",
          "inputs": {
            "schema": {
              "properties": {
                "CRMid": {
                  "type": "string"
                },
                "recordType": {
                  "type": "string"
                },
                "salesforceID": {
                  "type": "string"
                },
                "update": {
                  "type": "boolean"
                }
              },
              "required": [
                "CRMid",
                "recordType",
                "salesforceID",
                "update"
              ],
              "type": "object"
            }
          }
        }
      },

PassaggiSteps

È necessario registrare l'origine (richiesta) del record del paziente dal portale Dynamics CRM Online.We must log the source (request) of the patient record from the Dynamics CRM Online portal.

  1. È necessario ottenere un nuovo record di appuntamento da Dynamics CRM Online.We must get a new appointment record from Dynamics CRM Online.

    Il trigger proveniente da CRM fornisce il PatientID CRM, il tipo di record, un valore booleano new o update che indica un record nuovo o aggiornato e SalesforceId.The trigger coming from CRM provides us with the CRM PatentId, record type, New or Updated Record (new or update Boolean value), and SalesforceId. SalesforceId può essere Null perché viene usato solo per un aggiornamento.The SalesforceId can be null because it's only used for an update. Per ottenere il record CRM si userà il PatientID di CRM e il tipo di record.We get the CRM record by using the CRM PatientID and the Record Type.

  2. Successivamente, è necessario aggiungere l'app per le API di SQL Azure Cosmos DB InsertLogEntry operazione, come illustrato di seguito in Progettazione applicazione logica.Next, we need to add our Azure Cosmos DB SQL API app InsertLogEntry operation as shown here in Logic App Designer.

    Inserire una voce di logInsert log entry

    Inserire una voce di log

    Inserire una voce di logInsert error entry

    Inserire una voce di log

    Verificare la presenza di errori nella creazione di recordCheck for create record failure

    Condizione

Codice sorgente dell'app per la logicaLogic app source code

Nota

Quelli riportati di seguito sono solo esempi.The following examples are samples only. Dato che l'esercitazione è basata su un'implementazione attualmente in produzione, il valore di un nodo di origine potrebbe non mostrare le proprietà correlate alla pianificazione di un appuntamento.>Because this tutorial is based on an implementation now in production, the value of a Source Node might not display properties that are related to scheduling an appointment.>

RegistrazioneLogging

L'esempio di codice dell'app per la logica seguente illustra come gestire la registrazione.The following logic app code sample shows how to handle logging.

Voce di logLog entry

Questo è il codice sorgente dell'app per la logica per l'inserimento di una voce di log.Here is the logic app source code for inserting a log entry.

"InsertLogEntry": {
        "metadata": {
        "apiDefinitionUrl": "https://.../swagger/docs/v1",
        "swaggerSource": "website"
        },
        "type": "Http",
        "inputs": {
        "body": {
            "date": "@{outputs('Gets_NewPatientRecord')['headers']['Date']}",
            "operation": "New Patient",
            "patientId": "@{triggerBody()['CRMid']}",
            "providerId": "@{triggerBody()['providerID']}",
            "source": "@{outputs('Gets_NewPatientRecord')['headers']}"
        },
        "method": "post",
        "uri": "https://.../api/Log"
        },
        "runAfter":    {
            "Gets_NewPatientecord": ["Succeeded"]
        }
}

Richiesta di logLog request

Questo è il messaggio di richiesta di log inviato all'app per le API.Here is the log request message posted to the API app.

    {
    "uri": "https://.../api/Log",
    "method": "post",
    "body": {
        "date": "Fri, 10 Jun 2016 22:31:56 GMT",
        "operation": "New Patient",
        "patientId": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0",
        "providerId": "",
        "source": "{/"Pragma/":/"no-cache/",/"x-ms-request-id/":/"e750c9a9-bd48-44c4-bbba-1688b6f8a132/",/"OData-Version/":/"4.0/",/"Cache-Control/":/"no-cache/",/"Date/":/"Fri, 10 Jun 2016 22:31:56 GMT/",/"Set-Cookie/":/"ARRAffinity=785f4334b5e64d2db0b84edcc1b84f1bf37319679aefce206b51510e56fd9770;Path=/;Domain=127.0.0.1/",/"Server/":/"Microsoft-IIS/8.0,Microsoft-HTTPAPI/2.0/",/"X-AspNet-Version/":/"4.0.30319/",/"X-Powered-By/":/"ASP.NET/",/"Content-Length/":/"1935/",/"Content-Type/":/"application/json; odata.metadata=minimal; odata.streaming=true/",/"Expires/":/"-1/"}"
        }
    }

Risposta di logLog response

Questo è il messaggio di risposta di log proveniente dall'app per le API.Here is the log response message from the API app.

{
    "statusCode": 200,
    "headers": {
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "Date": "Fri, 10 Jun 2016 22:32:17 GMT",
        "Server": "Microsoft-IIS/8.0",
        "X-AspNet-Version": "4.0.30319",
        "X-Powered-By": "ASP.NET",
        "Content-Length": "964",
        "Content-Type": "application/json; charset=utf-8",
        "Expires": "-1"
    },
    "body": {
        "ttl": 2592000,
        "id": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0_1465597937",
        "_rid": "XngRAOT6IQEHAAAAAAAAAA==",
        "_self": "dbs/XngRAA==/colls/XngRAOT6IQE=/docs/XngRAOT6IQEHAAAAAAAAAA==/",
        "_ts": 1465597936,
        "_etag": "/"0400fc2f-0000-0000-0000-575b3ff00000/"",
        "patientID": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0",
        "timestamp": "2016-06-10T22:31:56Z",
        "source": "{/"Pragma/":/"no-cache/",/"x-ms-request-id/":/"e750c9a9-bd48-44c4-bbba-1688b6f8a132/",/"OData-Version/":/"4.0/",/"Cache-Control/":/"no-cache/",/"Date/":/"Fri, 10 Jun 2016 22:31:56 GMT/",/"Set-Cookie/":/"ARRAffinity=785f4334b5e64d2db0b84edcc1b84f1bf37319679aefce206b51510e56fd9770;Path=/;Domain=127.0.0.1/",/"Server/":/"Microsoft-IIS/8.0,Microsoft-HTTPAPI/2.0/",/"X-AspNet-Version/":/"4.0.30319/",/"X-Powered-By/":/"ASP.NET/",/"Content-Length/":/"1935/",/"Content-Type/":/"application/json; odata.metadata=minimal; odata.streaming=true/",/"Expires/":/"-1/"}",
        "operation": "New Patient",
        "salesforceId": "",
        "expired": false
    }
}

Verranno ora esaminati i passaggi della gestione degli errori.Now let's look at the error handling steps.

Gestione degli erroriError handling

L'esempio di codice di app per la logica seguente illustra come è possibile implementare la gestione degli errori.The following logic app code sample shows how you can implement error handling.

Creare record di erroreCreate error record

Questo è il codice sorgente dell'app per la logica per la creazione di un record di errore.Here is the logic app source code for creating an error record.

"actions": {
    "CreateErrorRecord": {
        "metadata": {
        "apiDefinitionUrl": "https://.../swagger/docs/v1",
        "swaggerSource": "website"
        },
        "type": "Http",
        "inputs": {
        "body": {
            "action": "New_Patient",
            "isError": true,
            "crmId": "@{triggerBody()['CRMid']}",
            "patientID": "@{triggerBody()['CRMid']}",
            "message": "@{body('Create_NewPatientRecord')['message']}",
            "providerId": "@{triggerBody()['providerId']}",
            "severity": 4,
            "source": "@{actions('Create_NewPatientRecord')['inputs']['body']}",
            "statusCode": "@{int(outputs('Create_NewPatientRecord')['statusCode'])}",
            "salesforceId": "",
            "update": false
        },
        "method": "post",
        "uri": "https://.../api/CrMtoSfError"
        },
        "runAfter":
        {
            "Create_NewPatientRecord": ["Failed" ]
        }
    }
}             

Inserire l'errore in Cosmos DB: richiestaInsert error into Cosmos DB--request


{
    "uri": "https://.../api/CrMtoSfError",
    "method": "post",
    "body": {
        "action": "New_Patient",
        "isError": true,
        "crmId": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0",
        "patientId": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0",
        "message": "Salesforce failed to complete task: Message: duplicate value found: Account_ID_MED__c duplicates value on record with id: 001U000001c83gK",
        "providerId": "",
        "severity": 4,
        "salesforceId": "",
        "update": false,
        "source": "{/"Account_Class_vod__c/":/"PRAC/",/"Account_Status_MED__c/":/"I/",/"CRM_HUB_ID__c/":/"6b115f6d-a7ee-e511-80f5-3863bb2eb2d0/",/"Credentials_vod__c/",/"DTC_ID_MED__c/":/"/",/"Fax/":/"/",/"FirstName/":/"A/",/"Gender_vod__c/":/"/",/"IMS_ID__c/":/"/",/"LastName/":/"BAILEY/",/"MasterID_mp__c/":/"/",/"C_ID_MED__c/":/"851588/",/"Middle_vod__c/":/"/",/"NPI_vod__c/":/"/",/"PDRP_MED__c/":false,/"PersonDoNotCall/":false,/"PersonEmail/":/"/",/"PersonHasOptedOutOfEmail/":false,/"PersonHasOptedOutOfFax/":false,/"PersonMobilePhone/":/"/",/"Phone/":/"/",/"Practicing_Specialty__c/":/"FM - FAMILY MEDICINE/",/"Primary_City__c/":/"/",/"Primary_State__c/":/"/",/"Primary_Street_Line2__c/":/"/",/"Primary_Street__c/":/"/",/"Primary_Zip__c/":/"/",/"RecordTypeId/":/"012U0000000JaPWIA0/",/"Request_Date__c/":/"2016-06-10T22:31:55.9647467Z/",/"ONY_ID__c/":/"/",/"Specialty_1_vod__c/":/"/",/"Suffix_vod__c/":/"/",/"Website/":/"/"}",
        "statusCode": "400"
    }
}

Inserire l'errore in Cosmos DB: rispostaInsert error into Cosmos DB--response

{
    "statusCode": 200,
    "headers": {
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "Date": "Fri, 10 Jun 2016 22:31:57 GMT",
        "Server": "Microsoft-IIS/8.0",
        "X-AspNet-Version": "4.0.30319",
        "X-Powered-By": "ASP.NET",
        "Content-Length": "1561",
        "Content-Type": "application/json; charset=utf-8",
        "Expires": "-1"
    },
    "body": {
        "id": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0-1465597917",
        "_rid": "sQx2APhVzAA8AAAAAAAAAA==",
        "_self": "dbs/sQx2AA==/colls/sQx2APhVzAA=/docs/sQx2APhVzAA8AAAAAAAAAA==/",
        "_ts": 1465597912,
        "_etag": "/"0c00eaac-0000-0000-0000-575b3fdc0000/"",
        "prescriberId": "6b115f6d-a7ee-e511-80f5-3863bb2eb2d0",
        "timestamp": "2016-06-10T22:31:57.3651027Z",
        "action": "New_Patient",
        "salesforceId": "",
        "update": false,
        "body": "CRM failed to complete task: Message: duplicate value found: CRM_HUB_ID__c duplicates value on record with id: 001U000001c83gK",
        "source": "{/"Account_Class_vod__c/":/"PRAC/",/"Account_Status_MED__c/":/"I/",/"CRM_HUB_ID__c/":/"6b115f6d-a7ee-e511-80f5-3863bb2eb2d0/",/"Credentials_vod__c/":/"DO - Degree level is DO/",/"DTC_ID_MED__c/":/"/",/"Fax/":/"/",/"FirstName/":/"A/",/"Gender_vod__c/":/"/",/"IMS_ID__c/":/"/",/"LastName/":/"BAILEY/",/"MterID_mp__c/":/"/",/"Medicis_ID_MED__c/":/"851588/",/"Middle_vod__c/":/"/",/"NPI_vod__c/":/"/",/"PDRP_MED__c/":false,/"PersonDoNotCall/":false,/"PersonEmail/":/"/",/"PersonHasOptedOutOfEmail/":false,/"PersonHasOptedOutOfFax/":false,/"PersonMobilePhone/":/"/",/"Phone/":/"/",/"Practicing_Specialty__c/":/"FM - FAMILY MEDICINE/",/"Primary_City__c/":/"/",/"Primary_State__c/":/"/",/"Primary_Street_Line2__c/":/"/",/"Primary_Street__c/":/"/",/"Primary_Zip__c/":/"/",/"RecordTypeId/":/"012U0000000JaPWIA0/",/"Request_Date__c/":/"2016-06-10T22:31:55.9647467Z/",/"XXXXXXX/":/"/",/"Specialty_1_vod__c/":/"/",/"Suffix_vod__c/":/"/",/"Website/":/"/"}",
        "code": 400,
        "errors": null,
        "isError": true,
        "severity": 4,
        "notes": null,
        "resolved": 0
        }
}

Risposta di errore di SalesforceSalesforce error response

{
    "statusCode": 400,
    "headers": {
        "Pragma": "no-cache",
        "x-ms-request-id": "3e8e4884-288e-4633-972c-8271b2cc912c",
        "X-Content-Type-Options": "nosniff",
        "Cache-Control": "no-cache",
        "Date": "Fri, 10 Jun 2016 22:31:56 GMT",
        "Set-Cookie": "ARRAffinity=785f4334b5e64d2db0b84edcc1b84f1bf37319679aefce206b51510e56fd9770;Path=/;Domain=127.0.0.1",
        "Server": "Microsoft-IIS/8.0,Microsoft-HTTPAPI/2.0",
        "X-AspNet-Version": "4.0.30319",
        "X-Powered-By": "ASP.NET",
        "Content-Length": "205",
        "Content-Type": "application/json; charset=utf-8",
        "Expires": "-1"
    },
    "body": {
        "status": 400,
        "message": "Salesforce failed to complete task: Message: duplicate value found: Account_ID_MED__c duplicates value on record with id: 001U000001c83gK",
        "source": "Salesforce.Common",
        "errors": []
    }
}

Restituire la risposta all'app per la logica padreReturn the response back to parent logic app

Dopo aver ottenuto la risposta, è possibile trasmetterla all'app per la logica padre.After you get the response, you can pass the response back to the parent logic app.

Restituire la risposta di esito positivo all'app per la logica padreReturn success response to parent logic app

"SuccessResponse": {
    "runAfter":
        {
            "UpdateNew_CRMPatientResponse": ["Succeeded"]
        },
    "inputs": {
        "body": {
            "status": "Success"
    },
    "headers": {
    "    Content-type": "application/json",
        "x-ms-date": "@utcnow()"
    },
    "statusCode": 200
    },
    "type": "Response"
}

Restituire la risposta di errore all'app per la logica padreReturn error response to parent logic app

"ErrorResponse": {
    "runAfter":
        {
            "Create_NewPatientRecord": ["Failed"]
        },
    "inputs": {
        "body": {
            "status": "BadRequest"
        },
        "headers": {
            "Content-type": "application/json",
            "x-ms-date": "@utcnow()"
        },
        "statusCode": 400
    },
    "type": "Response"
}

Portale e repository di Cosmos DBCosmos DB repository and portal

La soluzione aggiunta di funzionalità con Azure Cosmos DB.Our solution added capabilities with Azure Cosmos DB.

Portale di gestione degli erroriError management portal

Per consultare gli errori, è possibile creare un'app Web MVC per visualizzare i record di errore da Cosmos DB.To view the errors, you can create an MVC web app to display the error records from Cosmos DB. Nella versione corrente sono incluse operazioni di tipo Elenco, Dettagli, Modifica ed Elimina.The List, Details, Edit, and Delete operations are included in the current version.

Nota

Con l'operazione di modifica, Cosmos DB sostituisce l'intero documento.Edit operation: Cosmos DB replaces the entire document. I record contenuti nelle visualizzazioni elenco e dettagli sono solo esempi.The records shown in the List and Detail views are samples only. Non si tratta di record effettivi di appuntamenti dei pazienti.They are not actual patient appointment records.

Questi sono esempi dei dettagli dell'app MVC creati con l'approccio precedentemente descritto.Here are examples of our MVC app details created with the previously described approach.

Elenco di gestione degli erroriError management list

Elenco errori

Visualizzazione dei dettagli di gestione degli erroriError management detail view

Dettagli errore

Portale di gestione dei logLog management portal

È stata creata un'app Web MVC anche per visualizzare i log.To view the logs, we also created an MVC web app. Questi sono esempi dei dettagli dell'app MVC creati con l'approccio precedentemente descritto.Here are examples of our MVC app details created with the previously described approach.

Visualizzazione di dettagli dei log di esempioSample log detail view

Visualizzare i dettagli dei log

Dettagli dell'app per le APIAPI app details

API di gestione delle eccezioni di app per la logicaLogic Apps exception management API

L'app per le API di gestione delle eccezioni delle App per la logica di Azure offre le funzionalità descritte di seguito, sono presenti due controller:Our open-source Azure Logic Apps exception management API app provides functionality as described here - there are two controllers:

  • ErrorController inserisce un record di errore (documento) in una raccolta di Azure Cosmos DB.ErrorController inserts an error record (document) in an Azure Cosmos DB collection.
  • LogController inserisce un record di log (documento) in una raccolta di Azure Cosmos DB.LogController Inserts a log record (document) in an Azure Cosmos DB collection.

Suggerimento

Utilizzano entrambi i controller async Task<dynamic> operazioni, consentendo alle operazioni di risolvere in fase di esecuzione, affinché sia possibile creare lo schema di database di Azure Cosmos nel corpo dell'operazione.Both controllers use async Task<dynamic> operations, allowing operations to resolve at runtime, so we can create the Azure Cosmos DB schema in the body of the operation.

Ogni documento nel database di Azure Cosmos deve avere un ID univoco.Every document in Azure Cosmos DB must have a unique ID. Viene usato PatientId e viene aggiunto un timestamp che sarà convertito in un valore di timestamp Unix (double).We are using PatientId and adding a timestamp that is converted to a Unix timestamp value (double). Il valore viene troncato per rimuovere il valore frazionario.We truncate the value to remove the fractional value.

È possibile visualizzare il codice sorgente dell'API del controller degli errori da GitHub.You can view the source code of our error controller API from GitHub.

L'API viene chiamata da un'app per la logica usando la sintassi seguente:We call the API from a logic app by using the following syntax:

 "actions": {
        "CreateErrorRecord": {
          "metadata": {
            "apiDefinitionUrl": "https://.../swagger/docs/v1",
            "swaggerSource": "website"
          },
          "type": "Http",
          "inputs": {
            "body": {
              "action": "New_Patient",
              "isError": true,
              "crmId": "@{triggerBody()['CRMid']}",
              "prescriberId": "@{triggerBody()['CRMid']}",
              "message": "@{body('Create_NewPatientRecord')['message']}",
              "salesforceId": "@{triggerBody()['salesforceID']}",
              "severity": 4,
              "source": "@{actions('Create_NewPatientRecord')['inputs']['body']}",
              "statusCode": "@{int(outputs('Create_NewPatientRecord')['statusCode'])}",
              "update": false
            },
            "method": "post",
            "uri": "https://.../api/CrMtoSfError"
          },
          "runAfter": {
              "Create_NewPatientRecord": ["Failed"]
            }
        }
 }

L'espressione nell'esempio di codice precedente verifica la presenza dello stato Non riuscito di Create_NewPatientRecord.The expression in the preceding code sample checks for the Create_NewPatientRecord status of Failed.

SummarySummary

  • È possibile implementare facilmente la registrazione e la gestione degli errori in un'app per la logica.You can easily implement logging and error handling in a logic app.
  • È possibile utilizzare Azure Cosmos DB come repository per i record di log e di errore (documenti).You can use Azure Cosmos DB as the repository for log and error records (documents).
  • È possibile usare MVC per creare un portale per la visualizzazione dei record di log e di errore.You can use MVC to create a portal to display log and error records.

Codice sorgenteSource code

Il codice sorgente dell'applicazione per le API di gestione delle eccezioni di app per la logica è disponibile in questo repository GitHub.The source code for the Logic Apps exception management API application is available in this GitHub repository.

Passaggi successiviNext steps