Eine neue Azure-Funktion entwickeln |
Scroll |
So entwickeln Sie eine neue Azure-Funktion:
Obwohl viele verschiedene Sprachen und Tools zur Auswahl stehen, wird in dieser Anleitung nur das Erstellen von Azure-Funktionen über C# in Visual Studio behandelt. Dies ist die empfohlene Methode, da Testen und Debugging von Azure-Funktionen durch Drücken von F5 lokal erfolgen kann, ohne dass dazu ein Azure-Abonnement erforderlich ist. Es ist auch möglich, eine Funktion von Visual Studio aus in Azure bereitzustellen.
Stellen Sie sicher, dass Sie Visual Studio mit dem Workload "Azure development" installiert haben.
Klicken Sie in Visual Studio auf das Menü "Tools" und wählen Sie "Get Tools and Features…", um das Installationsprogramm zu öffnen.
Öffnen Sie die Registerkarte "Workloads" und suchen Sie nach "Azure development". Aktivieren Sie das Kontrollkästchen oben rechts und klicken Sie auf "Modify", um die Änderungen anzuwenden.
So erstellen Sie eine neue Azure-Funktion:
Wenn das Workload "Azure development" erfolgreich installiert wurde, ist "Azure Functions" eine der Optionen zum Erstellen eines neuen Projekts in Visual Studio. Es wird jedoch empfohlen, das Beispielprojekt "EmptyFunctionApp" als Ausgangspunkt zu verwenden, anstatt bei der Entwicklung von Null anzufangen.
Achten Sie darauf, "Azure Functions v2" (da "v1" in absehbarer Zeit eingestellt werden wird) und "Http trigger" auszuwählen, da Therefore™ Azure-Funktionen gegenwärtig nur über HTTP(S)-Anfragen aufrufen kann.
Zugriffsrechte werden nur angewendet, wenn Sie die Funktion veröffentlichen, nicht für die lokale Entwicklung. Wenn Sie "Anonymous" wählen, ist kein Schlüssel erforderlich. Bei "Function" ist der Funktionsschlüssel erforderlich, während bei "Admin" der Funktions-App-Schlüssel benötigt wird. Der Master-Schlüssel kann ebenfalls verwendet werden.
So verwenden Sie REST für Web-API-Aufrufe:
Fügen Sie den Ordner "Therefore" aus dem Beispielprojekt "EmptyFunctionApp" zu Ihrem Projekt hinzu.
Die Dateien sind nicht verbindlich, aber sie vereinfachen und beschleunigen die Entwicklung.
Wenn Änderungen in der Web-API dazu führen, dass WebAPIContract.cs aktualisiert werden muss, gehen Sie dazu wie folgt vor:
1.Laden Sie Silverlight SDK 5.0 oder höher herunter und installieren Sie es.
2.Vergewissern Sie sich, dass der XML-Dienst ausgeführt wird.
3.Erstellen Sie einen temporären Ordner, wie z. B. "C:\WebAPI".
4.Öffnen Sie eine Befehlszeile und gehen Sie zu "C:\Programme (x86)\Microsoft SDKs\Silverlight\v5.0\Tools".
5.Führen Sie den folgenden Befehl aus:
SlSvcUtil.exe http://servername:8000/theservice/v0001?singlewsdl /out:C:\WebAPI\WebAPIContract.cs /config:C:\WebAPI\output /namespace:http://schemas.therefore.net/webservices/interop/v0001/types,Therefore.WebAPI
6. Gehen Sie zu "C:\WebAPI" und kopieren Sie WebAPIContract.cs in den Ordner "Therefore\WebAPI", sodass sie die bestehende Datei ersetzt.
Wie im Beispielprojekt beschrieben, kann die Funktion SendRequest der Klasse "Therefore.WebAPI.WebApiClient" zum Senden einer Anfrage verwendet werden. Eine Liste der verfügbaren Befehle entnehmen Sie bitte der Web-API-Dokumentation.
Wenn Sie WebAPIContract.cs verwenden, benötigen Sie das NuGet-Paket "System.ServiceModel.Http". Nähere Informationen dazu finden Sie unter "Abhängigkeiten".
So verwenden Sie SOAP für Web-API-Aufrufe:
Fügen Sie den Ordner "Therefore" aus dem Beispielprojekt "EmptyFunctionApp" zu Ihrem Projekt hinzu und löschen Sie dann den Unterordner "WebAPI", da dieser nur für REST-Aufrufe benötigt wird. Da der Gebrauch von SOAP nicht die empfohlene Methode ist, muss der Wert für "UseREST" in der Klasse "TheConfig" auf "false" eingerichtet werden, sonst wäre die Eigenschaft "WebAPIBaseUrl" falsch.
Fügen Sie Therefore™ Web API als einen verbundenen Dienst hinzu:
Wählen Sie "Microsoft WCF Web Service Reference Provider" unter "Connected Service".
Fügen Sie den URL ein, wo der Webdienst ausgeführt wird, und klicken Sie auf "Go". Wenn der Dienst ausgeführt ist, sollte er in der Liste der Dienste als "ThereforeService" erscheinen.
Geben Sie einen aussagekräftigen Namespace wie z. B. "Therefore.WebAPI" und klicken Sie auf "Finish".
Die Klasse "Therefore.WebAPI.ThereforeServiceClient" kann für Web-API-Aufrufe verwendet werden.
Nähere Informationen zum NuGet-Paket "System.ServiceModel.Http" finden Sie unter "Abhängigkeiten".
So schließen Sie Abhängigkeiten ein:
Um das NuGet-Paket "System.ServiceModel.Http" hinzuzufügen, rechtsklicken Sie auf Ihr Projekt und wählen Sie "Manage NuGet Packages".
Gehen Sie zur Registerkarte "Browse" und suchen Sie nach "System.ServiceModel.Http". Wählen Sie den Eintrag aus und klicken Sie auf "Install".
Wenn während des Builds die folgende Fehlermeldung erscheint, ist ein Programmfehler noch nicht behoben:
System.IO.FileNotFoundException: Could not load file or assembly 'System.Private.ServiceModel, Version=4.5.0.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.
Bearbeiten Sie als Behelfslösung die CSPROJ-Datei und fügen Sie die folgende Konfiguration als untergeordnetes Element des Stammknotens "Project" hinzu:
<!--this is temporary workaround for issue https://github.com/dotnet/wcf/issues/2824 also requires nuget package-->
<Target Name="CopySPSM" BeforeTargets="Build">
<Copy SourceFiles="$(USERPROFILE)\.nuget\packages\system.private.servicemodel\
4.5.3\runtimes\win\lib\netstandard2.0\System.Private.ServiceModel.dll" DestinationFolder="$(OutputPath)\bin" />
</Target>
<ItemGroup>
<None Include="$(USERPROFILE)\.nuget\packages\system.private.servicemodel\
4.5.3\runtimes\win\lib\netstandard2.0\System.Private.ServiceModel.dll" CopyToPublishDirectory="Always" />
</ItemGroup>
<!--end workaround-->
Beachten Sie, dass die Versionsnummern und die Zeilenumbrüche möglicherweise angepasst werden müssen.
Was genau ist das Beispielprojekt "EmptyFunction App"?
Das Beispielprojekt "EmptyFunctionApp" ist eine kleine Azure-Funktion, welche die übergebenen Parameter aus Therefore™ abruft, den WebApiClient so konfiguriert, dass er betriebsbereit ist, und dann abschließend die erforderlichen Parameter zurückliefert. Das Beispiel kann als Ausgangspunkt für weitere Entwicklung verwendet werden.
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "v1/Function1")] HttpRequest req, ILogger log)
{
string errMsg = ""; // error message that will be returned to Therefore for logging
Exception logEx = null; // exception details for logging
bool routingDone = false; // false: WF instance will be routed to the next task.
// true: WF instance will not be routed because routing was done by WebAPI call
try…
if (!String.IsNullOrWhiteSpace(errMsg) || logEx != null)
log.LogError(logEx, errMsg); // log the error so it can be viewed in the Azure Portal
TheRespParams respParams = new TheRespParams(errMsg, routingDone);
return new OkObjectResult(respParams.Serialize());
"Run" ist die Hauptfunktion, die bei einer HTTP-Anfrage aufgerufen wird.
Der in HttpTrigger definierte “AuthorizationLevel” wird nur angewendet, wenn Sie die Funktion veröffentlichen, nicht für die lokale Entwicklung. Wenn Sie "Anonymous" wählen, ist kein Schlüssel erforderlich, für "Function" wird der Funktionsschlüssel benötigt und für "Admin" der Funktions-App-Schlüssel. Der Master-Schlüssel kann ebenfalls verwendet werden.
Die in HttpTrigger als "v1/Function1" definierte "Route" bietet eine Versionierungsmethode. Nehmen wir an, eine neue Workflow-Version erfordert eine neue Version der Funktion, aber einige Instanzen müssen weiterhin die alte Funktion verwenden. In diesem Fall könnten Sie die Funktion kopieren und die Route im Code und in der Aktivitätskonfiguration von "v1" zu "v2" ändern, um diese Anforderung zu erfüllen. Eine Funktions-App kann mehrere Funktionen enthalten.
Am Ende des Beispielprojekts werden eventuelle aufgetretene Fehler in Azure protokolliert und auch an ein Objekt der Klasse "TheRespParams" weitergegeben. Die Klasse "TheRespParams" wickelt das Konvertieren der verbindlichen Antwortparameter für Therefore™ in ein JSON-Objekt ab.
Es wird immer ein Objekt "OkObjectResult" erstellt, welches das JSON-Objekt mit dem HTTP-Statuscode 200 zurückliefert. Eventuelle Fehlermeldungen in "errMsg" werden zum Protokollieren im Workflow-Verlauf an Therefore™ zurückgeliefert. Von der Therefore™ aus gesehen, war der Funktionsaufruf erfolgreich, wenn kein Fehler aufgetreten ist ("errMsg" ist leer).
So verwenden Sie Skripte innerhalb von 'try':
try
{
// read parameters passed by Therefore
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
TheReqParams reqParams = TheReqParams.Deserialize(requestBody);
if (reqParams == null || reqParams.TheInstanceNo <= 0 || reqParams.TheTokenNo <= 0)
return new BadRequestObjectResult("Mandatory parameter not set"); // function was not called by Therefore, return HTTP error 400
reqParams.LogWFInfo(log); // log workflow information now, in case the function crashes later
// configuration
TheConfig config = TheConfig.Instance;
config.WebAPIBaseUrl = reqParams.TheWebAPIUrl;
config.Tenant = reqParams.TheTenant;
// Web API connection
WebApiClient client;
// specify a user name and password if the permissions from the accessToken would not be sufficient
if (!String.IsNullOrEmpty(config.UserName) && !String.IsNullOrEmpty(config.Password))
// connection with user name and password/token:
client = new WebApiClient(config.UserName, config.Password, config.IsToken, config.WebAPIUrl,
config.Tenant, config.Language, config.RequestTimeout, config.ClientTimezoneIANA);
else
// connection with JWT Bearer token 'accessToken'
client = new WebApiClient(reqParams.TheAccessToken, config.WebAPIUrl, config.Tenant,
config.Language, config.RequestTimeout, config.ClientTimezoneIANA);
// Add your code here
}
"TheReqParams" wickelt das Lesen aller Anfrageparameter ab, die von Therefore™ übergeben wurden.
Die Klasse "TheConfig" hat verschiedene Eigenschaften, die für den WebAPI-Aufruf benötigt werden, wie z. B. Sprache, Zeitzone, Anfrage-Timeout und andere. Sie können diese Ihren Anforderungen entsprechend konfigurieren oder die Standardwerte übernehmen.
Zwei Eigenschaften haben keinen nützlichen Standardwert: "WebAPIBaseUrl" und "Tenant". Die Werte werden vom Therefore™-Server übergeben und müssen dem Objekt "TheConfig" zugewiesen werden.
Während der lokalen Entwicklung liest die Klasse "TheConfig" Benutzernamen- und Kennworteigenschaften aus "local.settings.json" und bei Ausführung in Azure aus den Anwendungseinstellungen.
Das Objekt "WebApiClient" kann entweder über Benutzeranmeldeinformationen oder über den JWT-Token instantiiert werden.
Dies wird durch eine Prüfung entschieden, ob sie leer sind oder nicht. Wenn keine Anmeldeinformationen konfiguriert sind, wird der JWT-Token verwendet.
Die Funktion "SendRequest" der Klasse WebApiClient kann zum Senden einer Anfrage verwendet werden. Eine Liste der verfügbaren Befehle entnehmen Sie bitte der Web-API-Dokumentation.
Am Kommentar "Add your code here" können Sie Web-API-Anfragen einfügen und Ihre Geschäftslogik implementieren.
Bei Fehlschlag/Erfolg werden der Fehler oder eine leere Zeichenfolge zurückgeliefert, damit Therefore™ weiß, ob die Funktion wie erwartet arbeitet (außerhalb der "try/catch"-Aussage).
So verwenden Sie die Web-API:
In dieser Dokumentation wird allgemein dargelegt, wie Anfragen über die Web-API gesendet werden, ohne dabei jede einzelne verfügbare Funktion zu beschreiben. Einzelheiten zu den verschiedenen Funktionen entnehmen Sie bitte der Web-API-Dokumentation.
Web-API-Funktionen können über die Klasse "Therefore.WebAPI.WebApiClient" aufgerufen werden.
Zum Erstellen einer Instanz sind einige Parameter erforderlich. Wie für das Beispielprojekt "EmptyFunctionApp" beschrieben, kann das Objekt "TheConfig" dabei helfen. Wenn Sie ein Anfrage-Timeout konfigurieren, beachten Sie dabei bitte, dass die Funktion selbst von einer HTTP-Anfrage aufgerufen wird, bei der nach maximal 230 Sekunden eine Zeitüberschreitung eintritt.
Anmeldeinformationen:
WebApiClient client = new WebApiClient(username, password, isToken, webApiUrl, tenant, language, requestTimeout, clientTimezoneIANA);
JWT-Bearer-Token:
WebApiClient client = new WebApiClient(bearerToken, webApiUrl, tenant, language, requestTimeout, clientTimezoneIANA);
Nachdem das Objekt "WebApiClient" erstellt wurde, können Anfragen über die Funktion "SendRequest" gesendet werden.
Task<TResp> SendRequest<TReq, TResp>(TReq requestData)
Mit dieser einzelnen Funktion kann die gesamte Web-API-Funktionalität abgedeckt werden. Die Anfrage wird von der Art des Anfrage- und Antwortparameters bestimmt. Anfrage und Antwort müssen zueinander passen. Beispielsweise kann GetDocumentParams mit GetDocumentResponse für eine "GetDocument"-Anfrage verwendet werden.
Beispiel: Abrufen eines Dokuments (mit Dateien):
Dokumente können abgerufen werden über GetDocumentParams mit GetDocumentResponse in der Funktion "SendRequest".
Im Anfrageparameter "GetDocumentParams" muss die Dokumentnummer angegeben werden.
Wenn die Dateien des Dokuments ebenfalls abgerufen werden sollen, muss die Eigenschaft "IsStreamsInfoAndDataNeeded" auf "true" gesetzt werden. Wenn nur die Stream-Informationen ohne die Daten selbst ausreichend sind, setzen Sie "IsStreamsInfoNeeded" auf "true".
// Create request parameters
GetDocumentParams parameters = new GetDocumentParams();
parameters.DocNo = docNo;
parameters.IsStreamsInfoAndDataNeeded = true;
parameters.IsIndexDataValuesNeeded = true;
// Send the request
GetDocumentResponse docResp = client.SendRequest<GetDocumentParams, GetDocumentResponse>(parameters).Result;
// Extract all file streams to the specified directory
string extractDir = Path.GetTempPath();
foreach (var streamInfo in docResp.StreamsInfo)
{
string extractFileName = Path.Combine(extractDir, streamInfo.FileName);
File.WriteAllBytes(extractFileName, streamInfo.StreamData);
Was ist die Therefore™-Benutzeroberfläche?
Response:
Jede Funktion, die von der neuen Workflow-Aktivität "Call Function" aufgerufen wird, muss in der HTTP-Antwort eine Reihe verbindlicher Parameter im JSON-Format zurückliefern:
•TheError: Verbindlicher Zeichenfolgewert. Wenn die Zeichenfolge nicht leer ist, wird sie im Workflow-Verlauf angezeigt. Die Instanz wird als fehlerhaft markiert, es sei denn, es wurde ein weiterer Versuch zu einem späteren Zeitpunkt angefordert.
•TheRetryAfterMin: Optionaler Ganzzahlwert. Kann verwendet werden, um einen erneuten Versuch von Therefore™ anzufordern.
Wenn der Parameter auf einen Wert größer als Null eingerichtet ist, verhält sich die "Funktion aufrufen" wie eine Warten-Aktivität und sendet eine neue Anfrage, nachdem die angegebene Anzahl von Minuten verstrichen ist (ungefähr). Wenn "TheError" gesetzt ist, wird dies als Warnung behandelt und es führt nicht dazu, dass die Workflow-Instanz als fehlerhaft markiert wird.
•TheRoutingDone: Verbindlicher Boolescher Wert, es sei denn, "TheRetryAfterMin" ist eingerichtet.
Kann auf "true" eingerichtet werden, um anzuzeigen, dass das Weiterleiten der Workflow-Instanz bereits über die Web-API-Funktion “FinishCurrentWorkflowTask” erfolgt ist. Wenn der Parameter auf "false" eingerichtet ist, leitet Therefore™ die Workflow-Instanz zur nächsten Aktivität weiter. Wenn "TheRetryAfterMin" eingerichtet ist, erfolgt die Weiterleitung noch nicht, d. h. der Parameter ist in diesem Fall optional.
Um die Rückgabe dieser Parameter zu vereinfachen, wurde die Klasse "TheRespParams" erstellt. Sie enthält alle diese Parameter als Eigenschaften und stellt die Funktion "Serialize" zum Erstellen eines JSON-Objekts bereit.
Ein Objekt dieser Klasse kann auf zwei verschiedene Weisen initialisiert werden:
1. über "TheError" und über "TheRoutingDone".
TheRespParams respParams = new TheRespParams(errMsg, routingDone);
Dies sollte als Standardfall verwendet werden oder wenn ein Fehler aufgetreten ist. Beide Werte sind optional.
Standardmäßig ist "errMsg" leer und "routingDone" ist "false".
2. Gebrauch von "TheError" und "TheRoutingDone"
TheRespParams respParams = new TheRespParams(retryAfterMin, errMsg);
Dies weist Therefore™ an, die Funktion zu einem späteren Zeitpunkt erneut zu versuchen. Der Ganzzahlwert "retryAfterMin" muss größer als Null sein. "errMsg" ist optional und wird als zusätzliche Informationen (nicht als Fehler) im Workflow-Verlauf protokolliert.
Request:
Bei jedem Funktionsaufruf sendet Therefore™ die folgenden Parameter mit der HTTPS-Anfrage als JSON an die Funktion:
•TheWebAPIUrl: Enthält die Servereinstellung "URL für Web-API", die auf der Registerkarte "XML Web Service" oder in den erweiterten Einstellungen konfiguriert werden kann. Wenn Sie Therefore™ Online verwenden, wird diese Einstellung bereits korrekt konfiguriert sein, aber sie kann auch leer sein.
•TheTenant: Der Name des aktuellen Mandanten. Wird leer sein, wenn das System nicht für Mehrfachmandanten eingerichtet ist.
•TheAccessToken: Ein JWT-Token kann verwendet werden, um über die Web-API eine Verbindung zu Therefore™ einzurichten. Der Token gibt dem Benutzer "$TheWFSystem" Zugriff auf das Dokument bzw. die Akte, das/die mit der aktuellen Workflow-Instanz verknüpft ist, sowie Zugriff auf die aktuelle Workflow-Instanz und den Workflow-Token selbst. Mit den gewährten Zugriffsrechten ist es möglich, Änderungen am verknüpften Dokument, an der verknüpften Akte oder an mit der Akte verknüpften Dokumenten vorzunehmen. Die gewährten Zugriffsrechte sollten auch das Weiterleiten der Workflow-Instanz an eine andere Aktivität gestatten. Es können jedoch keine neuen Dokumente oder Akten erstellt oder Abfragen ausgeführt werden. Außerdem können die Akte bzw. das Dokument, die mit der Workflow-Instanz verknüpft sind, oder die Workflow-Instanz selbst nicht gelöscht werden.
•TheInstanceNo: Die Instanznummer der aktuellen Workflow-Instanz.
•TheTokenNo: Die Tokennummer der aktuellen Workflow-Instanz.
•TheCaseNo: Die Nummer der mit der aktuellen Workflow-Instanz verknüpften Akte. Dieser Parameter ist nur für Akten-Workflows verfügbar.
•TheDocNo: Die Nummer des mit der aktuellen Workflow-Instanz verknüpften Hauptdokuments. Dieser Parameter ist nur für Dokument-Workflows verfügbar.
•TheSettings: JSON-Objekt (als Zeichenfolge übergeben) mit allen konfigurierten benutzerdefinierten Funktionseinstellungen.
Dies kann leer sein oder verwendet werden, um zusätzliche Parameter an die aufgerufene Funktion zu übergeben. Name und Wert der einzelnen Einstellungen können frei gewählt werden, aber Namen müssen entsprechend der JSON-Spezifikation eindeutig sein. Alle Werte werden als Zeichenfolgewerte behandelt und müssen, wenn erforderlich, innerhalb der Funktion konvertiert werden.
Um das Lesen dieser Parameter aus der JSON-Zeichenfolge zu vereinfachen, wird die Klasse "TheReqParams" erstellt. Sie enthält alle diese Parameter als Eigenschaften und stellt die Funktion "Deserialize" zum Erstellen eines Objekts aus einer JSON- Zeichenfolge bereit.
Der Code der Klasse "TheReqParams" kann als Beispiel für Ihre benutzerdefinierten Einstellungen verwendet werden.
Nehmen wir z. B. an, Sie haben "TaskNo" in der Konfiguration der Workflow-Aktivität mit einem Ganzzahlwerte als benutzerdefinierte Funktionseinstellung definiert. In diesem Fall können Sie die folgende Klasse verwenden, um sie zu lesen.
class CustomSettings
{
public string taskNo;
public int TaskNo
{
get { return int.Parse(taskNo); }
set { taskNo = value.ToString(); }
}
public static CustomSettings Deserialize(string json)
{
return JsonConvert.DeserializeObject<CustomSettings>(json);
}
}
So geben Sie einen Benutzernamen und ein Kennwort für eine Web-API-Verbindung an:
Der Code im Beispielprojekt prüft in erster Linie, ob ein Benutzername und ein Kennwort angegeben wurden. Der bereitgestellte Zugriffstoken wird nur verwendet, wenn dies nicht der Fall ist. Auf diese Weise ist der Token die Standardeinstellung, es sei denn, Sie geben einen Benutzernamen und ein Kennwort an. Diese Anmeldeinformationen können erforderlich sein, wenn mehr Zugriffsrechte benötigt werden, als der Token bietet.
TheConfig.cs verwendet den ConfigurationBuilder, um sowohl auf "local.settings.json" und auf die Umgebungsvariablen zuzugreifen und nach der Konfiguration zu suchen.
Wenn Sie die Azure-Funktion lokal ausführen, wird die Einstellung aus "local.settings.json" gelesen. Um die Einstellung hinzuzufügen, fügen Sie die Einstellungen "WebAPIUser" und "WebAPIPassword" wie folgt in das JSON-Objekt "Values" ein:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"WebAPIUser": "Domain\\TestUser1",
"WebAPIPassword": "secretpassword"
}
}
Wenn die Funktion in Azure implementiert ist, werden die Einstellungen aus den App-Einstellungen gelesen.
Um den Benutzernamen und das Kennwort hinzuzufügen, wählen Sie Ihre Funktions-App im Azure-Portal aus und klicken Sie auf "Application settings". Neue Einstellungen können hinzugefügt werden, indem Sie auf "New application setting" klicken.
Klicken Sie abschließend auf "Save".
So implementieren Sie eine Azure-Funktion:
Azure-Funktionen können direkt aus Visual Studio auf der Microsoft Azure-Plattform bereitgestellt werden.
Rechtsklicken Sie auf das Projekt und wählen Sie "Publish", um Ihre Azure-Funktion zu veröffentlichen.
Wenn Sie "Folder", wählen, müssen Sie die Funktion manuell über FTP hochladen.
Der Name der Funktions-App muss global eindeutig sein, da eine kleine Website mit dem Namen "https://FunctionAppName.azurewebsites.net" erstellt wird. Diese Website ist öffentlich verfügbar, unabhängig davon, ob die Funktion über HTTP ausgelöst wird oder nicht (der HTTP-Auslöser verwendet den gleichen URL).
Jede Azure Funktions-App muss ein Speicherkonto haben, in dem die Funktionen sowie die Protokolle gespeichert werden.
Es gibt zwei verschiedene Optionen zum Hosten einer Funktions-App:
•Verbrauchsplan
Der Verbrauchsplan weist automatisch Verarbeitungsleistung zu, wenn Ihr Code ausgeführt wird. Ihre App wird hochskaliert, wenn Arbeitslasten zu verarbeiten sind, und herunterskaliert, wenn der Code nicht ausgeführt wird. Sie brauchen nicht im Voraus für VMs im Leerlauf oder für Reservekapazität zu bezahlen.
Die Abrechnung basiert auf der Anzahl der Ausführungen, der Ausführungszeit und dem verwendeten Arbeitsspeicher.
Ein Verbrauchsplan ist für Funktionen mit kurzer Laufzeit konzipiert. Die vorgegebene maximale Ausführungsdauer beträgt 5 Minuten und dieser Wert kann auf 10 Minuten erhöht werden. (Beachten Sie, dass für von HTTP-ausgelöste Funktionen unabhängig von der konfigurierten Ausführungszeit ein Timeout von 230 Sekunden gilt.)
•App-Dienst-Plan
Bei einem dedizierten App-Dienst-Plan wird Ihre Funktion auf dedizierten VMs entsprechend den Optionen Basic, Standard, Premium, oder Isolated ausgeführt, gleich wie für andere App-Dienst-Apps. Es werden dedizierte VMs zu Ihrer Funktions-App zugewiesen, was bedeutet, dass der Funktions-Host immer aktiv sein kann.
Eine dedizierte VM macht die Kosten unabhängig von der Anzahl der Ausführungen, der Ausführungszeit und dem verwendeten Arbeitsspeicher. Ein App-Dienst-Plan kann kostengünstiger sein, wenn Ihre Funktions-Apps durchgehend oder fast ununterbrochen ausgeführt werden.
Nach einer erfolgreichen Implementierung führt ein Aufruf der Funktion zu einem 401-Fehler "Nicht autorisiert".
Standardmäßig wird ein Funktionsschlüssel für die Autorisierung verwendet, der bei jedem Aufruf bereitgestellt werden muss.
Dieser Schlüssel kann vom Azure-Portal abgerufen werden.
Nachdem Sie die Funktions-App geöffnet haben, klicken Sie auf "Manage" und kopieren Sie den Schlüssel "Default".
Ein Aufruf von Therefore™ wird diesen Schlüssel als "x-functions-key" in der Anfragekopfzeile enthalten, sofern konfiguriert.
Ein Test der erfolgreichen Implementierung ohne Therefore™ kann über cURL oder ein ähnliches Programm erfolgen.
curl –d “” –i –X POST “https://AppName.azurwebsites.net/api/Route?code=FunctionKey”
Wenn keine Route definiert ist, wird anstelle dessen der Funktionsname verwendet.
So entwickeln Sie eine neue Azure-Funktion über Visual Studio Code:
Visual Studio Code kann als Alternative zu Visual Studio verwendet werden. Es unterstützt das Erstellen neuer Azure-Funktionen von Grund auf oder unter Verwendung eines unserer Beispiele sowie das lokale Debugging, ohne dass dafür ein Azure-Abonnement erforderlich ist. Nähere Informationen finden Sie im Leitfaden von Microsoft.
Voraussetzungen, die heruntergeladen und installiert werden müssen:
•Microsoft .Net Core SDK.
oFür Azure-Funktionen, die Version 2 verwenden, wird .NET Core 2.1 SDK benötigt.
oFür Azure-Funktionen, die Version 3 verwenden, wird .NET Core 3.1 SDK benötigt.
•Microsoft SQL Server Express (für Azure Storage Emulator)
Ein Neustart ist erforderlich. Führen Sie die Installation erneut aus, wenn das Programm nicht automatisch gestartet wird. Wenn eine Nicht-Express-Version von SQL Server bereits installiert ist, kann dieser Schritt übersprungen werden.
•C#-Erweiterung für Visual Studio Code
•Azure-Funktionserweiterung für Visual Studio Code
Azure Storage Emulator einrichten
Beim Erstellen einer neuen Azure-Funktion in VS-Code wird standardmäßig kein Speicher verwendet. Dieser kann jedoch aktiviert werden, indem Sie die folgenden Zeilen zu local.settings.json hinzufügen:
Beachten Sie, dass der VS-Code keine nachgestellten Kommas unterstützt.
Im Gegensatz zu Visual Studio startet VS Code den Storage Emulator nicht automatisch, daher muss er vor dem Debuggen/Ausführen Ihrer Funktion manuell gestartet werden.
Erstellung auf der Basis unserer SDK-Beispiele
Starten Sie VS Code, klicken Sie auf "Datei -> Ordner öffnen…" und wählen Sie den Ordner, der eines unserer SDK-Beispiele enthält (z. B. den Ordner EmptyFunctionApp-Ordner mit EmptyFunctionApp.sln).
Beachten Sie, dass die SLN-Dateien in diesem Dialogfeld ausgeblendet werden.
Nach dem Öffnen eines Beispiels in VS Code werden möglicherweise einige Benachrichtigungen angezeigt.
Wenn nicht aufgelöste Abhängigkeiten vorliegen, klicken Sie auf "Wiederherstellen", um diese aufzulösen.
Wenn die Meldung "Azure-Funktionsprojekt … erkannt, das möglicherweise außerhalb von VS-Code erstellt wurde" erscheint, klicken Sie auf "Ja" und warten Sie, bis VS Code die Konfiguration der Umgebung abgeschlossen hat.