Aspire 13.2 : Ce que les développeurs de services .NET doivent savoir
Partage de quelques notes sur la version Aspire 13.2 de l'équipe d'ingénierie ici chez Iron Software. Nous livrons des bibliothèques .NET (IronPDF, IronOCR, IronXL, IronWord, IronBarcode, et le reste), et presque tous les appels clients finissent par toucher à l'orchestration d'applications distribuées. C'est pourquoi nous prêtons attention aux publications Aspire. 13.2 est la première où le CLI semble vraiment pouvoir remplacer le tableau de bord pour la plupart des travaux quotidiens, et il y a quelques changements de rupture qui vous causeront des tracas lors de la mise à jour.
Ce n'est pas un régurgitation des notes de version. La page officielle des nouveautés a la liste exhaustive. Voici les éléments réellement utiles dans une base de code de travail, plus les pièges à éviter.
TL;DR
- CLI est maintenant vraiment scriptable : mode détaché,
aspire ps,aspire arrêter, mode isolé, sortie JSON - TypeScript AppHost est en aperçu si vous voulez abandonner le
.csprojpour la couche d'orchestration - Les fichiers de config sont consolidés dans
aspire.config.json(les fichiers hérités migrent automatiquement) - Foundry remplace Azure AI Foundry. Celui-ci cassera votre build
WithSecretBuildArgest renommé enWithBuildSecret- Les variables d'environnement de découverte de services utilisent désormais le schéma, pas le nom de l'endpoint (risque de rupture silencieuse)
- Comportement de la crédential par défaut d'Azure modifié dans les intégrations des clients
Le CLI est enfin un CLI
C'est le titre principal. Avant la version 13.2, aspire run bloquait votre terminal et le tableau de bord était la seule surface réaliste pour gérer un apphost en cours d'exécution. Bien pour un développeur solo, gênant pour le CI, les tests d'intégration, ou tout flux de travail dirigé par un agent.
La version 13.2 corrige cela :
# Run in the background
aspire run --detach
# Or the new shortcut
aspire start
# See what's running
aspire ps
# Stop it
aspire arrêter
aspire arrêter --all
# Run in the background
aspire run --detach
# Or the new shortcut
aspire start
# See what's running
aspire ps
# Stop it
aspire arrêter
aspire arrêter --all
Combiné avec --format json (qui se dirige vers stdout tandis que les messages de statut vont vers stderr, important si vous redirigez quelque part), vous pouvez construire une véritable automatisation autour de cela. aspire ps --resources --format json est un solide bloc de construction pour les intégrations éditeur et les scripts.
Le mode isolé est le héros méconnu
--isolated est celui que nous attendions. Il exécute un apphost avec des ports aléatoires et des secrets utilisateur isolés, évitant les conflits de ports et les collisions de configuration :
aspire run --isolated
aspire start --isolated
aspire run --isolated
aspire start --isolated
Si jamais vous avez essayé de faire fonctionner deux extraits du même apphost en même temps — disons principal contre une branche de fonctionnalité, des tests d'intégration en parallèle ou des flux de travail pilotés par un agent — vous avez ressenti la douleur. Des ports aléatoires plus des secrets séparés signifient que vous pouvez enfin simplement lancer N copies et ne pas vous en soucier.
Pour les arbres de travail git seuls, cela vaut la mise à jour. Pour les suites de tests d'intégration qui font fonctionner de véritables services avec des dépendances natives (rendu Chrome pour la génération de PDF, Tesseract pour OCR, les habituels poids lourds), c'est la différence entre fragile et fiable.
aspire doctor et aspire describe
aspire doctor parcourt votre environnement : état du certificat de développement, version de l'environnement d'exécution du conteneur, SDK .NET, config WSL2, configuration de l'agent. C'est le genre de chose que chaque framework devrait avoir et que la plupart ignorent. La sortie est exploitable. Quand quelque chose ne va pas, il vous dit quoi faire.
aspire describe --follow vous donne une vue en streaming de l'état des ressources depuis le terminal. Les mêmes données que montre le tableau de bord, mais qui peuvent être redirigées. Mettez-le dans un volet tmux et vous obtenez la plupart de la valeur du tableau de bord en 80 colonnes.
Les commandes de ressources ont été améliorées
Les anciennes commandes resource-start / resource-arrêter / resource-restart sont déconseillées au profit de la forme de sous-commande plus propre :
aspire resource api restart
aspire resource api rebuild
aspire resource api restart
aspire resource api rebuild
rebuild est nouveau. Il arrête, construit et redémarre une ressource de projet .NET unique sans démonter toute la session de l'apphost. Si vous avez déjà modifié un service dans un graphe de 12 ressources et que vous en avez grogné de devoir tout redémarrer, c'est la solution. Nous avons ressenti cela nous-mêmes : lorsque vous itérez sur un modèle de rendu PDF ou que vous ajustez le prétraitement OCR, redémarrer tout le graphe juste pour recharger un projet devient vite fastidieux.
Secrets et certificats sans quitter le CLI
Deux nouveaux groupes de commandes dédiés :
aspire certs clean
aspire certs trust
aspire secret set ApiKey super-secret-value
aspire secret list --format json
aspire certs clean
aspire certs trust
aspire secret set ApiKey super-secret-value
aspire secret list --format json
aspire secret est la plus grande victoire. Il est mappé au même magasin de secrets utilisateur qui soutient AddParameter(..., secret: true) dans le modèle d'application, mais vous n'avez pas besoin du CLI .NET installé pour les gérer. Dans un apphost polyglotte où tous les développeurs n'ont pas le SDK .NET, cela compte.
aspire wait pour CI
aspire wait api --status healthy --timeout 120
aspire wait api --status healthy --timeout 120
Bloquez l'état d'une ressource. Combiné avec aspire start et --format json, vous pouvez enfin écrire des scripts CI qui attendent que tout soit réellement prêt au lieu de sleep 30 && hope.
Configuration : un fichier pour les régner tous
Aspire consolide ses fichiers de configuration. L'ancienne séparation entre .aspire/settings.json et apphost.run.json a disparu, remplacée par un seul aspire.config.json à la racine du projet :
{
"appHost": {
"path": "apphost.ts",
"language": "typescript/nodejs"
},
"sdk": { "version": "13.2.0" },
"channel": "stable",
"profiles": {
"default": {
"applicationUrl": "https://localhost:17000;http://localhost:15000"
}
}
}
La migration est automatique. La première fois que vous exécutez une commande aspire dans un projet existant, les fichiers hérités sont fusionnés dans le nouveau format avec les chemins réattribués à la racine du projet. Les fichiers hérités sont conservés afin que vous puissiez encore utiliser d'anciennes versions du CLI côte à côte. Les paramètres globaux (globalsettings.json) migrent également.
Si vous avez une automatisation qui s'adresse directement à .aspire/settings.json ou apphost.run.json, prévoyez de la déplacer.
TypeScript AppHost (aperçu)
Cela est intéressant même si vous ne l'utilisez pas dès le premier jour. Vous pouvez maintenant écrire votre apphost en TypeScript au lieu de C# :
import { createBuilder } from './.modules/aspire.js';
const builder = await createBuilder();
const cache = await builder.addRedis("cache");
const api = await builder.addProject("api", "../api")
.withReference(cache)
.waitFor(cache);
await builder.build().run();
Sous le capot, l'apphost TS fonctionne comme un processus invité communiquant avec l'hôte d'orchestration .NET d'Aspire via JSON-RPC sur un transport local. Même modèle de ressources, même tableau de bord, mêmes intégrations, exprimé en TypeScript.
La partie intéressante est le codegen. Lorsque vous exécutez aspire add, le CLI inspecte l'assembly .NET de l'intégration et génère un SDK TypeScript dans .modules/. aspire restore les régénère, utile après une mise à niveau ou un changement de branche (s'exécute également automatiquement sur aspire run). Le générateur 13.2 a également ajouté des cibles de test pour Go, Java et Rust, ce qui indique où cela se dirige.
Pour les équipes prioritairement .NET comme la nôtre, c'est plus "regardez ça" que "expédiez ça", mais le schéma de codegen signifie que les futurs langages d'apphost polyglottes suivent tous le même modèle. Voir la documentation sur l'architecture multilingue pour voir comment fonctionne le pont hôte.
Tableau de bord : export/import de télémétrie est le nouveau jouet
Le tableau de bord a obtenu un véritable flux de travail d'exportation/importation. Depuis Paramètres → Gérer, sélectionnez les ressources et les types de télémétrie et exportez-les au format JSON dans une archive zip. Réimportez-les plus tard dans le tableau de bord ou transmettez-les à une autre personne (ou à un LLM) pour analyse.
La commande CLI aspire export produit le même paquet :
aspire export --output .\artifacts\aspire-export.zip
aspire export <resource>
aspire export --output .\artifacts\aspire-export.zip
aspire export <resource>
Vraiment utile pour les rapports de bugs. Au lieu de "voici quelques captures d'écran et un fichier journal", vous pouvez joindre un instantané de l'état réel de la télémétrie.
Autres notes du tableau de bord :
- Vous pouvez maintenant définir des paramètres de ressources directement depuis l'interface utilisateur du tableau de bord, avec une option pour les persister dans les secrets utilisateur
- Les variables d'environnement peuvent être exportées sous forme de fichiers
.envdepuis la vue des détails des ressources - La disposition du graphe de ressources utilise un positionnement dirigé adaptatif. Les graphiques complexes sont visiblement moins encombrés
- L'API HTTP de télémétrie à
/api/telemetryrenvoie un JSON OTLP ; prend en charge?follow=truepour le streaming NDJSON. Les points de terminaison couvrent les ressources, les intervalles, les journaux et les traces (y compris/traces/{traceId}pour une recherche de trace complète)
Le tableau de bord autonome désactive désormais par défaut l'API de télémétrie. Si vous hébergez vous-même le tableau de bord et que vous dépendez de l'API, vous avez besoin de DASHBOARD__API__ENABLED=true plus la configuration d'authentification (DASHBOARD__API__AUTHMODE et DASHBOARD__API__PRIMARYAPIKEY). Les scénarios intégrés à AppHost fonctionnent toujours car Aspire.Hosting connecte automatiquement l'API pour les outils.
Éléments du modèle d'application à noter
WithMcpServer
Vous pouvez déclarer dans le modèle d'application qu'une ressource héberge un endpoint MCP :
var api = builder.AddProject<Projects.MyApi>("api")
.WithMcpServer("/mcp");
var api = builder.AddProject<Projects.MyApi>("api")
.WithMcpServer("/mcp");
Dim api = builder.AddProject(Of Projects.MyApi)("api") _
.WithMcpServer("/mcp")
Les outils Aspire peuvent alors découvrir et servir de proxy à ce point de terminaison. Si vous expédiez quelque chose qui expose des outils aux agents de développement, c'est la manière la plus élégante de l'intégrer. Chemin personnalisé ou nom de point de terminaison pris en charge via les options.
Résolution contextuelle des points de terminaison
C'est le genre de chose que vous ne remarquez pas jusqu'à ce que vous en ayez besoin. Les points de terminaison peuvent désormais être résolus du point de vue d'un appelant spécifique ou d'un réseau :
var endpoint = redis.GetEndpoint("tcp");
var url = await endpoint.GetValueAsync(new ValueProviderContext {
Caller = containerApp.Resource,
});
var endpoint = redis.GetEndpoint("tcp");
var url = await endpoint.GetValueAsync(new ValueProviderContext {
Caller = containerApp.Resource,
});
Dim endpoint = redis.GetEndpoint("tcp")
Dim url = Await endpoint.GetValueAsync(New ValueProviderContext With {
.Caller = containerApp.Resource
})
Le même point de terminaison Redis se résoudra en localhost:6379 depuis un processus hôte, host.docker.internal:6379 depuis un conteneur sur le réseau hôte, ou cache:6379 depuis un conteneur sur le réseau de conteneurs Aspire, selon le contexte. La classe KnownNetworkIdentifiers vous donne LocalhostNetwork, DefaultAspireContainerNetwork et PublicInternet si vous préférez choisir un réseau plutôt qu'un appelant.
Les notes de version indiquent explicitement que ces APIs existaient dans 13.1 mais ne se comportaient pas correctement. Donc, si vous avez écrit quelque chose en fonction d'elles dans 13.1, refaites les tests. Détails complets dans la documentation sur les hiérarchies de ressources.
Secrets de construction de conteneurs
WithSecretBuildArg est renommé en WithBuildSecret. Le nouveau nom est plus clair. Ces secrets transitent par Docker/Podman en tant que secrets de construction appropriés, et non en tant qu'arguments de construction (qui fuient dans l'historique de l'image).
builder.AddContainer("worker", "contoso/worker")
.WithDockerfile("../worker")
.WithBuildSecret("ACCESS_TOKEN", accessToken);
builder.AddContainer("worker", "contoso/worker")
.WithDockerfile("../worker")
.WithBuildSecret("ACCESS_TOKEN", accessToken);
Les secrets de construction peuvent désormais également être des fichiers (par exemple, .npmrc pour l'authentification du registre privé dans les constructions de conteneurs), qui couvrent la plupart des cas d'utilisation réels.
Intégrations : celles qui comptent
La liste complète est longue. Voici celles que je soulignerais :
- La publication Docker Compose est maintenant stable (était en préversion).
AddDockerComposeEnvironmentgénère undocker-compose.yamlà partir de votre modèle d'application au moment de la publication. Une échappatoire utile lorsque "déployer sur Azure" n'est pas la réponse. Cela vaut la peine de noter si vous livrez des conteneurs qui incluent des dépendances natives, car IronPDF, IronOCR et IronXL prennent tous en charge les conteneurs Linux et Docker proprement, donc le fichier de composition généré fonctionne généralement sans intervention manuelle. - L'intégration au réseau virtuel Azure (
Aspire.Hosting.Azure.Network) vous permet de déclarer des VNets, sous-réseaux, NSGs, passerelles NAT et points de terminaison privés dans l'apphost.AddPrivateEndpointcrée automatiquement des zones DNS privées, des liens de réseaux virtuels et désactive l'accès public sur la cible. C'est le genre de chose qui nécessitait auparavant un fichier Bicep séparé. - Le Azure Data Lake Storage a obtenu un support d'hébergement et client :
AddDataLake,AddDataLakeFileSystem, plusAddAzureDataLakeServiceClient/AddAzureDataLakeFileSystemClientcôté client. Enregistrement DI, reprises, vérifications de santé, télémétrie, la pile Aspire habituelle. - MongoDB EF Core dispose d'une nouvelle intégration client (
Aspire.MongoDB.EntityFrameworkCore).AddMongoDbContext<TContext>pour le cas typique, ouEnrichMongoDbContext<TContext>()si vous enregistrez vous-même le DbContext. - Inference AI Azure prend désormais en charge les embeddings, pas seulement le chat. Enregistrez
AddAzureEmbeddingsClient("embeddings").AddEmbeddingGenerator()et injectezIEmbeddingGenerator<string, Embedding<float>>. La variante clé est également disponible. - Le registre de conteneurs Azure a obtenu
WithPurgeTask("0 1 * * *", ago: TimeSpan.FromDays(7), keep: 5), qui prévoit une tâche de purge ACR sur un calendrier cron. - Support de Bun pour les ressources JavaScript via
WithBun(). La fiabilité de Yarn avecAddViteAppa également été corrigée viaWithYarn(). - Foundry Microsoft remplace Azure AI Foundry.
Aspire.Hosting.FoundryremplaceAspire.Hosting.Azure.AIFoundry. Changement de rupture ; détails ci-dessous.
Mettre le tout ensemble : un service de document dans Aspire 13.2
Voici le schéma que nous utilisons en interne pour tester des scénarios distribués avec nos bibliothèques. Cela vaut la peine de le montrer car la plupart des nouvelles fonctionnalités de la version 13.2 sont payantes dans ce type de configuration multi-services, pas dans les démonstrations gadgets.
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
// A worker service that uses IronPDF for HTML to PDF rendering
var renderer = builder.AddProject<Projects.PdfRenderer>("renderer")
.WithReference(cache)
.WaitFor(cache)
.WithMcpServer("/mcp");
// An OCR worker that uses IronOCR for image and PDF text extraction
var ocr = builder.AddProject<Projects.OcrWorker>("ocr-worker")
.WithReference(cache);
// API gateway that fans out to both
builder.AddProject<Projects.Api>("api")
.WithReference(renderer)
.WithReference(ocr)
.WaitFor(renderer)
.WaitFor(ocr);
builder.Build().Run();
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
// A worker service that uses IronPDF for HTML to PDF rendering
var renderer = builder.AddProject<Projects.PdfRenderer>("renderer")
.WithReference(cache)
.WaitFor(cache)
.WithMcpServer("/mcp");
// An OCR worker that uses IronOCR for image and PDF text extraction
var ocr = builder.AddProject<Projects.OcrWorker>("ocr-worker")
.WithReference(cache);
// API gateway that fans out to both
builder.AddProject<Projects.Api>("api")
.WithReference(renderer)
.WithReference(ocr)
.WaitFor(renderer)
.WaitFor(ocr);
builder.Build().Run();
Imports DistributedApplication
Dim builder = DistributedApplication.CreateBuilder(args)
Dim cache = builder.AddRedis("cache")
' A worker service that uses IronPDF for HTML to PDF rendering
Dim renderer = builder.AddProject(Of Projects.PdfRenderer)("renderer") _
.WithReference(cache) _
.WaitFor(cache) _
.WithMcpServer("/mcp")
' An OCR worker that uses IronOCR for image and PDF text extraction
Dim ocr = builder.AddProject(Of Projects.OcrWorker)("ocr-worker") _
.WithReference(cache)
' API gateway that fans out to both
builder.AddProject(Of Projects.Api)("api") _
.WithReference(renderer) _
.WithReference(ocr) _
.WaitFor(renderer) _
.WaitFor(ocr)
builder.Build().Run()
Ce que vous obtenez spécifiquement de 13.2 :
aspire start --isolatedvous permet d'exécuter deux copies de ce graphique côte à côte sans conflits de port. Utile lors de la comparaison des branches ou de l'exécution de tests d'intégration parallèles contre le moteur de renduaspire resource renderer rebuildrecharge uniquement le moteur de rendu PDF lorsque vous changez un modèle Razor, au lieu de redémarrer l'ensemble du graphiqueaspire wait renderer --status healthy --timeout 120permet à votre CI de bloquer jusqu'à ce que le rendu Chrome soit initialisé avant d'effectuer les tests de génération PDF- L'API HTTP de télémétrie et
aspire exportvous donnent des intervalles formatés OTLP pour chaque appel de rendu, ce qui est la façon dont vous attraperiez réellement une règle CSS lente dans le trafic de production WithMcpServervous permet d'exposer le moteur de rendu comme un outil MCP pour les flux de travail d'agents de codage, utile si vous construisez quelque chose qui génère programmatique des documents
Si vous souhaitez créer un service comme le moteur de rendu ci-dessus, le tutoriel HTML to PDF d'IronPDF passe en revue le côté C#. Pour le travailleur OCR, le guide de démarrage IronOCR couvre les bases.
Changements significatifs qui vont vraiment vous affecter
Dans l'ordre approximatif de probabilité de les rencontrer :
Renommage des variables d'environnement de découverte de services
# Before (13.0/13.1)
services__myservice__myendpoint__0 = https://localhost:5001
# After (13.2)
services__myservice__https__0 = https://localhost:5001
# Before (13.0/13.1)
services__myservice__myendpoint__0 = https://localhost:5001
# After (13.2)
services__myservice__https__0 = https://localhost:5001
Le schéma de l'endpoint est utilisé au lieu du nom de l'endpoint. Si votre code ou votre configuration correspond à ces noms de variables d'environnement, mettez-les à jour. C'est la rupture silencieuse la plus probable : rien ne génère d'erreur, les variables ont simplement des clés différentes.
BeforeResourceStartedEvent
Précédemment déclenché de manière plus large ; ne se déclenche maintenant que lorsqu'une ressource démarre réellement, pas à chaque changement d'état. Si votre gestionnaire comptait sur le comportement précédent, il cessera de fonctionner silencieusement.
AIFoundry à Foundry
Renommage des packages et API. Mettez à jour la référence de package et les appels :
<PackageReference Include="Aspire.Hosting.Foundry" Version="13.2.0" />
<PackageReference Include="Aspire.Hosting.Foundry" Version="13.2.0" />
// Before
var ai = builder.AddAzureAIFoundry("ai");
// After
var foundry = builder.AddFoundry("ai");
var project = foundry.AddProject("agents");
var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
// Before
var ai = builder.AddAzureAIFoundry("ai");
// After
var foundry = builder.AddFoundry("ai");
var project = foundry.AddProject("agents");
var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
' Before
Dim ai = builder.AddAzureAIFoundry("ai")
' After
Dim foundry = builder.AddFoundry("ai")
Dim project = foundry.AddProject("agents")
Dim chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini)
RunAsFoundryLocal fonctionne toujours pour le développement de modèle local, mais les projets Foundry ne sont pas pris en charge lorsque la ressource parente est configurée comme Foundry Local.
Identifiant Azure par défaut
Les intégrations client Aspire Azure n'utilisent plus le constructeur sans paramètre DefaultAzureCredential. Si vous comptiez sur des informations d'identification autres que ManagedIdentityCredential travaillant dans un service Azure, le comportement change. Lisez le document sur l'identifiant Azure par défaut avant de mettre à jour en production.
Renommage de commande de ressource
resource-start / resource-arrêter / resource-restart sont maintenant aspire resource <name> démarrer|arrêter|redémarrer. Mettez à jour tous les scripts. L'option --apphost est également maintenant préférée sur l'héritage --project (qui est toujours acceptée).
Suffixe de propriété de connexion
Un suffixe de propriété de connexion a été ajouté. Si vous accédez directement aux propriétés de connexion (plutôt qu'à travers WithReference), vérifiez que votre code les résout toujours.
WithSecretBuildArg à WithBuildSecret
Voir ci-dessus. Renommage direct.
IAzureContainerRegistry obsolète
Utilisez la propriété ContainerRegistry sur les environnements informatiques à la place.
API de télémétrie du tableau de bord maintenant en opt-in (autonome)
Déjà couvert ci-dessus, mais cela vaut la peine de le répéter : les déploiements de tableau de bord autonomes doivent désormais activer explicitement l'API.
Faut-il effectuer la mise à jour ?
Pour un atelier .NET fonctionnel exécutant des applications multi-services localement, oui, à condition d'avoir inventorié les changements significatifs ci-dessus. Les améliorations du CLI à elles seules en valent la peine. Le mode détaché et le mode isolé en particulier corrigent de réels problèmes de workflow.
Pour les utilisateurs de Foundry : le renommage est une migration forcée si vous souhaitez des nouveautés de cette version, planifiez donc en conséquence.
Pour les personnes curieuses de TypeScript : 13.2 est la première version où le hôte d'application TS est suffisamment réel pour être évalué. Encore en prévisualisation, mais ça vaut un vendredi après-midi.
La mise à jour elle-même est une simple ligne de commande si vous êtes déjà sur la version 13.x :
aspire update --self
aspire update
aspire update --self
aspire update
Si vous êtes sur la version 12.x ou antérieure, consultez d'abord le guide de mise à jour. Il y a une étape 13.0 que vous ne pouvez pas ignorer.
Note de patch : 13.2.1
13.2.1 a été expédié depuis la version initiale avec des correctifs de fiabilité. Il y a un petit renommage du SDK TypeScript à noter, qui ne compte que si vous êtes déjà sur la prévisualisation de l'hôte d'application TS :
| Précédent | Nouveau |
|---|---|
runAsExistingFromParameters(name, resourceGroup) |
runAsExisting(name, { resourceGroup }) |
publishAsExistingFromParameters(name, resourceGroup) |
publishAsExisting(name, { resourceGroup }) |
withConnectionPropertyValue(name, value) |
withConnectionProperty(name, value) |
withParameterBuildArg(name, parameter) |
withBuildArg(name, parameter) |
withConnectionPropertyValue est conservé en tant qu'alias de compatibilité dans les SDK générés, donc ce n'est pas une rupture d'exécution.
Construire des applications .NET distribuées avec des charges de documents ?
Si vos services effectuent de la génération de PDF, de l'OCR, du traitement Excel, des codes-barres ou d'autres formats que nous couvrons, nos bibliothèques sont conçues pour ce type d'installation multi-services, compatible avec les conteneurs qu'Aspire orchestre. Tout prend en charge .NET 10, 9, 8, 7, 6, Framework, et Core, et fonctionne dans les conteneurs Linux, Azure, AWS et sur site.
Quelques endroits pour commencer :
- IronPDF pour la conversion HTML en PDF, l'édition de PDF, la signature et les formulaires. Le centre de tutoriels est le chemin le plus rapide vers un service de rendu fonctionnel
- IronOCR pour l'extraction de texte d'images et de PDF dans plus de 125 langues
- IronXL pour la lecture et écriture d'Excel sans Interop Office
- IronWord pour la génération et l'édition de DOCX
- IronBarcode et IronQR pour la génération et la numérisation de code-barres et de QR
- Iron Suite si vous avez besoin de plus d'un des éléments ci-dessus
Vous pouvez obtenir une clé d'essai de 30 jours et avoir un service PDF ou OCR fonctionnel dans une application Aspire en moins d'une heure. Si vous rencontrez quelque chose d'étrange, notre équipe de support est constituée de véritables ingénieurs, pas d'une file d'attente de triage de tickets.
C'est ça. À la prochaine version.