Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Handbuch erfahren Sie, wie Sie den Daten-API-Generator (DATA API Builder, DAB) für Azure App Service bereitstellen, ohne Containerimages zu erstellen oder zu verwalten. App Service bietet integrierte Unterstützung für TLS, benutzerdefinierte Domänen, Skalierung, Überwachung und Microsoft Entra Authentifizierung.
Tip
Wenn Ihre Umgebung Container verwendet, lesen Sie stattdessen Deploy to Azure Container Apps or Deploy to Azure Kubernetes Service.
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Kostenlos ein Konto erstellen.
- CLI des Daten-API-Erstellers. Installieren Sie die CLI-.
- Azure CLI. Installieren Sie die Azure-Befehlszeilenschnittstelle.
- .NET 8 SDK oder höher auf Ihrem lokalen Entwicklungs- oder Buildcomputer installiert.
- Eine vorhandene unterstützte Datenbank, auf die Azure zugreifen können.
Important
Der integrierte .NET App Service-Stapel enthält die .NET Laufzeit, enthält jedoch nicht das .NET SDK. Stellen Sie DAB wieder her, und stellen Sie das Bereitstellungspaket auf Ihrem lokalen Entwicklungs- oder Buildcomputer zusammen.
dotnet tool restore nicht ausführen, wenn der App Service gestartet wird.
Erstellen der Konfigurationsdatei
Erstellen Sie eine DAB-Konfigurationsdatei, um eine Verbindung mit Ihrer vorhandenen Datenbank herzustellen.
Erstellen Sie ein leeres Verzeichnis auf Ihrem lokalen Computer, um die Konfigurationsdatei und Bereitstellungsartefakte zu speichern.
Initialisieren Sie eine neue Basiskonfigurationsdatei mit
dab init. Verwenden Sie die@env()Funktion, um auf dieDATABASE_CONNECTION_STRINGUmgebungsvariable zu verweisen, sodass Anmeldeinformationen nicht in der Konfigurationsdatei gespeichert werden.dab init --database-type "<database-type>" --connection-string "@env('DATABASE_CONNECTION_STRING')"Important
Ersetzen Sie
<database-type>mit einem unterstützten Datenbanktyp, wiemssql,postgresql,mysqlodercosmosdb_nosql. Für einige Datenbanktypen sind zusätzliche Konfigurationseinstellungen für die Initialisierung erforderlich.Fügen Sie der Konfiguration mindestens eine Datenbankentität hinzu. Verwenden Sie den Befehl
dab add, um eine Entität zu konfigurieren. Wiederholen Siedab addso oft, wie Sie für Ihre Entitäten benötigen.dab add "<entity-name>" --source "<schema>.<table>" --permissions "anonymous:*"Öffnen und überprüfen Sie den Inhalt der dab-config.json Datei. Überprüfen Sie Folgendes:
-
data-source.connection-stringverwendet@env('DATABASE_CONNECTION_STRING') - Ihre Entitäten und Berechtigungen sind korrekt.
Important
Betten Sie keine wörtlichen Verbindungszeichenfolgen oder geheimen Zugangsdaten in
dab-config.jsonein. Verwenden Sie die@env()Funktion, sodass Werte aus Umgebungsvariablen zur Laufzeit aufgelöst werden.-
DAB für den Buildvorgang anheften
Verwenden Sie ein Manifest für lokale .NET-Tools, um die DAB-Version auf Ihrem Entwicklungs- oder Buildcomputer festzulegen. Das Manifest macht Builds reproduzierbar, enthält aber nicht die wiederhergestellten DAB-Binärdateien. Sie kopieren diese Binärdateien weiter unten in diesem Handbuch in das Bereitstellungspaket.
Erstellen Sie ein .NET lokalen Toolmanifest in Ihrem Projektverzeichnis.
dotnet new tool-manifestInstallieren Sie eine bestimmte Daten-API-Generator-Version als lokales Tool. Ersetzen Sie
<dab-version>durch die Version, die Sie bereitstellen möchten, z. B.2.0.9.dotnet tool install microsoft.dataapibuilder --version "<dab-version>"Überprüfen Sie, ob das Manifest vorhanden ist unter
.config/dotnet-tools.json.Stellen Sie das angeheftete Tool auf dem Entwicklungs- oder Build-Computer wiederher.
dotnet tool restoreNote
Der Wiederherstellungsvorgang füllt den lokalen NuGet-Paketcache auf. Das App Service-Bereitstellungspaket muss die wiederhergestellte Laufzeitnutzlast enthalten. Die Bereitstellung nur von
.config/dotnet-tools.jsonreicht nicht aus.
Lokales Testen
Vergewissern Sie sich vor der Bereitstellung für Azure, dass die Laufzeit gestartet wird und Ihre Endpunkte funktionieren.
Legen Sie die Verbindungszeichenfolge als lokale Umgebungsvariable fest.
$env:DATABASE_CONNECTION_STRING = "<your-connection-string>"Starten Sie die DAB-Laufzeit lokal.
dotnet tool run dab startTesten Sie den REST-Endpunkt, indem Sie zur Swagger-Benutzeroberfläche navigieren oder eine Anfrage an
/api/<entity-name>senden.Testen Sie den GraphQL-Endpunkt bei
/graphql.Beenden Sie die Laufzeit, nachdem Sie alle Endpunkte überprüft haben.
Erstellen der App Service-Ressourcen
Erstellen Sie die Azure Ressourcen, die zum Hosten von DAB in App Service erforderlich sind.
Eine neue Ressourcengruppe erstellen. Sie verwenden diese Ressourcengruppe für alle neuen Ressourcen in diesem Handbuch.
az group create --name "<resource-group-name>" --location "<location>"Tip
Erwägen Sie die Benennung der Ressourcengruppe "msdocs-dab-appservice".
Erstellen eines App Service-Plans
az appservice plan create --name "<plan-name>" --resource-group "<resource-group-name>" --sku B1 --is-linuxNote
In diesem Leitfaden wird die Ebene B1 (Basic) unter Linux verwendet.
Erstellen Sie die Web-App mit der .NET 8 Laufzeit und einer vom System zugewiesenen verwalteten Identität.
az webapp create --name "<app-name>" --resource-group "<resource-group-name>" --plan "<plan-name>" --runtime "DOTNETCORE:8.0" --assign-identity "[system]"Tip
Überprüfen Sie die verfügbaren Laufzeiten für Ihren Plan mit
az webapp list-runtimes --os linux.
Konfigurieren von App Service-Einstellungen
Konfigurieren Sie die Umgebungsvariablen und den Startbefehl, den Der App-Dienst zum Ausführen von DAB benötigt.
Legen Sie die Datenbank-Verbindungszeichenfolge als App Service Anwendungseinstellung fest.
az webapp config appsettings set --name "<app-name>" --resource-group "<resource-group-name>" --settings DATABASE_CONNECTION_STRING="<your-connection-string>"Tip
Verwenden Sie eine Verbindungszeichenfolge, die keine geheimen Schlüssel enthält. Verwenden Sie stattdessen verwaltete Identitäten und Microsoft Entra Authentifizierung, um den Zugriff zwischen Ihrer Datenbank und Dem App Service zu verwalten. Weitere Informationen finden Sie unter Azure-Dienste, die verwaltete Identitätenverwenden.
Konfigurieren Sie die Adresse, auf die DAB lauscht. Port
8080ist der Anwendungsport für den integrierten Linux App Service-Stapel.az webapp config appsettings set --name "<app-name>" --resource-group "<resource-group-name>" --settings ASPNETCORE_URLS="http://0.0.0.0:8080"Aktivieren Sie die AlwaysOn- und Dateisystemprotokollierung vor der ersten Bereitstellung. Always On ist auf der in diesem Handbuch verwendeten B1-Ebene verfügbar.
az webapp config set --name "<app-name>" --resource-group "<resource-group-name>" --always-on true az webapp log config --name "<app-name>" --resource-group "<resource-group-name>" --application-logging filesystem --docker-container-logging filesystem --level informationErstellen Sie ein Startskript, das die im Bereitstellungspaket enthaltene DAB-Laufzeitnutzlast startet. Erstellen Sie eine Datei mit dem Namen
startup.shin Ihrem Projektverzeichnis.#!/bin/sh set -eu exec dotnet ./dab/Microsoft.DataApiBuilder.dll start --config ./dab-config.jsonImportant
Stellen Sie sicher, dass
startup.shLF-Zeilenenden (Unix) verwendet, nicht CRLF. Windows Editoren können standardmäßig mit CRLF gespeichert werden, was dazu führt, dass das Skript auf dem Linux App Service-Host fehlschlägt.Legen Sie den Startbefehl in App Service fest.
az webapp config set --name "<app-name>" --resource-group "<resource-group-name>" --startup-file "sh startup.sh"
Konfigurieren der verwalteten Identität für Azure SQL
Wenn Ihre Datenquelle Azure SQL ist, autorisieren Sie die vom System zugewiesene verwaltete Identität der Web-App in der Datenbank. Überspringen Sie diesen Abschnitt, wenn Sie eine andere Datenbank oder Authentifizierungsmethode verwenden.
Stellen Sie eine Verbindung mit der Zieldatenbank als Microsoft Entra Administrator her.
Erstellen Sie einen enthaltenen Datenbankbenutzer für die Web-App-Identität, und erteilen Sie nur die Berechtigungen, die von Ihren DAB-Entitäten benötigt werden. Im folgenden Beispiel werden Lese- und Schreibvorgänge unterstützt.
CREATE USER [<app-name>] FROM EXTERNAL PROVIDER; ALTER ROLE [db_datareader] ADD MEMBER [<app-name>]; ALTER ROLE [db_datawriter] ADD MEMBER [<app-name>];Note
Die Microsoft Entra-Identitätsweitergabe kann nach dem Erstellen der Web-App einige Minuten dauern. Wenn
CREATE USERdie Identität nicht sofort ermitteln kann, warten Sie und versuchen Sie es erneut.Legen Sie
DATABASE_CONNECTION_STRINGauf eine Azure SQL-Verbindungszeichenfolge für eine verwaltete Identität fest.az webapp config appsettings set --name "<app-name>" --resource-group "<resource-group-name>" --settings DATABASE_CONNECTION_STRING="Server=tcp:<sql-server-name>.database.windows.net,1433;Initial Catalog=<database-name>;Authentication=Active Directory Managed Identity;Encrypt=True;TrustServerCertificate=False;"
Bereitstellen in App Service
Kopieren Sie die wiederhergestellte DAB-Laufzeit in Ihr Anwendungsverzeichnis, und stellen Sie dann das Verzeichnis mithilfe der ZIP-Bereitstellung bereit.
Erstellen Sie ein Anwendungsverzeichnis, das die DAB-Konfiguration, das Startskript und die wiederhergestellte Laufzeitnutzlast enthält.
In den Beispielen wird die DAB-Version
2.0.9verwendet. Legen Sie die Version auf die gleiche Version fest, die Sie in.config/dotnet-tools.jsonangeheftet haben.$dabVersion = "2.0.9" $globalPackages = (dotnet nuget locals global-packages --list) -replace '^global-packages:\s*', '' $dabPayload = Join-Path $globalPackages "microsoft.dataapibuilder/$dabVersion/tools/net8.0/any" $appDirectory = Join-Path (Get-Location) "app" Remove-Item $appDirectory -Recurse -Force -ErrorAction SilentlyContinue New-Item -ItemType Directory -Path (Join-Path $appDirectory "dab") -Force | Out-Null Copy-Item dab-config.json, startup.sh -Destination $appDirectory Copy-Item (Join-Path $dabPayload "*") -Destination (Join-Path $appDirectory "dab") -Recurse if (-not (Test-Path (Join-Path $appDirectory "dab/Microsoft.DataApiBuilder.dll"))) { throw "The restored DAB runtime payload wasn't found." }Important
Führen Sie diese Befehle auf demselben Computer aus, auf dem Sie das angeheftete DAB-Tool wiederhergestellt haben. Wenn Ihre Umgebung das globale NuGet-Paketverzeichnis überschreibt, ermittelt
dotnet nuget localsdessen Speicherort.Erstellen Sie eine ZIP-Datei mit portablen
/Trennzeichen für Einträge. Das Stammverzeichnis des Archivs mussdab-config.json,startup.shund das Verzeichnisdab/direkt enthalten. Komprimieren Sie das übergeordneteapp-Verzeichnis nicht.Remove-Item deploy.zip -Force -ErrorAction SilentlyContinue tar.exe -a -c -f deploy.zip -C $appDirectory dab-config.json startup.sh dabWarnung
Unter Windows kann
Compress-Archivegeschachtelte Einträge unter Verwendung von\als Trennzeichen speichern. Die Kudu-ZIP-Bereitstellung kann dieses Archiv mit HTTP 400 zurückweisen. Verwenden Sie ein ZIP-Tool, das Trennzeichen/speichert, und überprüfen Sie die Einträge im Archiv, wenn bei der Bereitstellung HTTP 400 ohne Details zurückgegeben wird.Stellen Sie das ZIP-Paket in App Service bereit.
az webapp deploy --resource-group "<resource-group-name>" --name "<app-name>" --src-path deploy.zip --type zip --clean true --restart false --timeout 600000Starten Sie die Web-App neu, nachdem die Bereitstellung abgeschlossen ist.
az webapp restart --resource-group "<resource-group-name>" --name "<app-name>"
Überprüfen Sie die Bereitstellung
Vergewissern Sie sich nach der Bereitstellung, dass DAB erfolgreich im App-Dienst gestartet wird.
Öffnen Sie die App-Dienst-URL. Die Stammantwort enthält den DAB-Status und die Version.
https://<app-name>.azurewebsites.netTesten Sie REST- und GraphQL-Endpunkte mit denselben Entitätspfaden, die Sie lokal getestet haben. Die bereitgestellte App verwendet dasselbe
dab-config.json, sodass das Endpunktverhalten ihrer lokalen Laufzeit entsprechen sollte.https://<app-name>.azurewebsites.net/api/<entity-name> https://<app-name>.azurewebsites.net/graphqlNote
Im Produktionsmodus kann
/healthHTTP 403 zurückgeben, wenn der Aufrufer nicht berechtigt ist, den umfassenden Integritätsbericht anzuzeigen. Wenn die Stamm- und die Endpunkte der autorisierten Entität erfolgreich antworten, weist eine 403-Antwort von/healthnicht auf einen Startfehler hin.Wenn ein Endpunkt einen unerwarteten Fehler zurückgibt, überprüfen oder herunterladen Sie die Anwendungsprotokolle. Die Protokollierung wurde in dieser Anleitung vor der Bereitstellung aktiviert.
az webapp log tail --name "<app-name>" --resource-group "<resource-group-name>" az webapp log download --name "<app-name>" --resource-group "<resource-group-name>" --log-file appservice-logs.zip
Konfigurieren der Authentifizierung (optional)
Schützen Sie Ihren App Service-Endpunkt mit Microsoft Entra ID für die Produktionsverwendung.
Ausführliche Schritte finden Sie unter Konfigurieren der App Service-Authentifizierung.
Nachdem Sie die App Service-Authentifizierung aktiviert haben, konfigurieren Sie DAB so, dass es den von App Service eingefügten Identitätsheadern vertraut. Führen Sie diesen Befehl auf Ihrem Entwicklungscomputer aus und erstellen Sie dann das ZIP-Paket neu und stellen Sie es erneut bereit.
dab configure --runtime.host.authentication.provider AppService
Important
Der AppService Authentifizierungsanbieter in dab-config.json vertraut auf Header, die von der App Service-Authentifizierung eingefügt werden. Stellen Sie sicher, dass die App Service-Authentifizierung bei Verwendung dieses Anbieters in der Produktion aktiviert ist. Weitere Informationen finden Sie unter Easy Auth (App Service).
Note
Die App Service-Authentifizierung schützt den Ausgang zu Ihrem Endpunkt. DAB-Entitätsberechtigungen steuern weiterhin, welche Vorgänge die Laufzeit zulässt. Verlassen Sie sich bei einer anonymen Demo nicht auf die Identitätsheader von App Service. Aktivieren Sie für den rollenbasierten Zugriff die App Service-Authentifizierung, und aktualisieren Sie Ihre Entitätsberechtigungen so, dass authentifizierte oder benutzerdefinierte Rollen anstelle von anonymous:* verwendet werden.
Problembehandlung bei der Bereitstellung
Verwenden Sie die folgenden Symptome, um häufige Bereitstellungsprobleme zu identifizieren.
| Symptom | Ursache und Auflösung |
|---|---|
| ZIP-Bereitstellung gibt HTTP 400 ohne Details zurück. | Überprüfen Sie das ZIP-Stammverzeichnis und die Trennzeichen der Einträge. Erstellen Sie die ZIP-Datei mit /-Trennzeichen neu und stellen Sie sicher, dass sie dab-config.json, startup.sh und dab/ direkt enthält. |
Die App gibt HTTP 503 zurück, und Protokolle enthalten No .NET SDKs were found oder The application 'tool' does not exist |
Der Startbefehl versucht, dotnet tool auszuführen. Erstellen Sie das Paket mit der wiederhergestellten DAB-Nutzlast neu und rufen Sie Microsoft.DataApiBuilder.dll direkt auf. |
| Der Start erreicht den Benutzerbefehl, der App-Dienst-Warmup schlägt jedoch fehl. | Überprüfen Sie, ob das Startskript LF-Zeilenenden verwendet, verwenden Sie sh startup.sh, bestätigen Sie die DAB-Nutzlastpfade und prüfen Sie die Abhör-URL sowie Datenbankfehler in den Protokollen. |
| DAB wird gestartet, Datenbankanforderungen schlagen jedoch fehl. | Überprüfen Sie, ob die verwaltete Identität der Web-App als Datenbankbenutzer vorhanden ist und über die berechtigungen verfügt, die von den konfigurierten Entitäten benötigt werden. |
/health gibt HTTP 403 zurück, während REST oder GraphQL funktioniert |
DAB läuft, aber der Anrufer ist nicht berechtigt, den umfassenden Zustandsbericht anzuzeigen. Überprüfen Sie stattdessen den Stamm oder einen autorisierten Entitätsendpunkt. |
| Eine größere ZIP-Bereitstellung gibt HTTP 502 zurück. | Überprüfen Sie den Bereitstellungsverlauf, bevor Sie den Vorgang wiederholen. Synchron mit einem explizit festgelegten Timeout bereitstellen, den impliziten Neustart deaktivieren und nach Abschluss der Bereitstellung neu starten. |
Bereinigen von Ressourcen
Wenn Sie die Web-App und die zugehörigen Ressourcen nicht mehr benötigen, löschen Sie die Ressourcengruppe.
az group delete --name "<resource-group-name>" --yes --no-wait