WIADOMOśCI Z BRANżY

Build 2025: AI & .NET Prognoza dla klientów Iron Software

Dzielenie się notatkami na temat wydania Aspire 13.2 od zespołu inżynierów w Iron Software. Dostarczamy biblioteki .NET (IronPDF, IronOCR, IronXL, IronWord, IronBarcode i inne), i praktycznie każda rozmowa z klientem kończy się na temat organizacji aplikacji rozproszonych. Dlatego zwracamy uwagę na wydania Aspire. 13.2 to pierwsze, w którym CLI wydaje się, że może rzeczywiście zastąpić dashboard dla większości codziennej pracy, a są pewne zmiany, które ugryzą cię przy aktualizacji.

To nie jest powtórzenie notatek wydawniczych. Oficjalna strona co nowego ma wyczerpującą listę. To są rzeczy, które są naprawdę przydatne w praktykującym kodzie, plus pułapki, na które trzeba zwrócić uwagę.

TL;DR

  • CLI jest teraz w pełni skryptowalny: tryb odłączony, aspire ps, aspire stop, tryb izolowany, wyjście JSON
  • TypeScript AppHost jest w wersji zapoznawczej, jeśli chcesz porzucić .csproj dla warstwy orkiestracji
  • Pliki konfiguracyjne zostały skonsolidowane do aspire.config.json (stare pliki automatycznie migrują)
  • Foundry zastępuje Azure AI Foundry. To złamie twoją budowę
  • WithSecretBuildArg zostało przemianowane na WithBuildSecret
  • Zmienne środowiskowe odkrywania usług teraz korzystają z schematu, a nie z nazwy punktu końcowego (ciche ryzyko przerwania)
  • Domyślne zachowanie poświadczeń Azure zmieniło się w integracjach klientów

Konsola CLI to w końcu konsola CLI

To jest nagłówek. Przed wersją 13.2, aspire run blokowało twój terminal, a dashboard był jedyną realną powierzchnią do zarządzania działającym apphost. Dobre dla dewelopera solo, niezręczne dla CI, testów integracyjnych lub jakiegokolwiek przepływu pracy opartego na agencie.

13.2 to naprawia:

# Run in the background
aspire run --detach

# Or the new shortcut
aspire start

# See what's running
aspire ps

# Stop it
aspire stop
aspire stop --all
# Run in the background
aspire run --detach

# Or the new shortcut
aspire start

# See what's running
aspire ps

# Stop it
aspire stop
aspire stop --all
SHELL

W połączeniu z --format json (które idzie do stdout, podczas gdy komunikaty statusu idą do stderr, co jest ważne, jeśli gdziekolwiek rurasz), możesz zbudować wokół tego prawdziwą automatyzację. aspire ps --resources --format json to solidny blok budowlany dla integracji edytora i skryptów.

Tryb izolowany to nieśpiewany bohater

--isolated to ten, na który czekaliśmy. Uruchamia apphost z randomizowanymi portami i odizolowanymi tajnościami użytkownika, zapobiegając konflikty portów i kolizje konfiguracji:

aspire run --isolated
aspire start --isolated
aspire run --isolated
aspire start --isolated
SHELL

Jeśli kiedykolwiek próbowałeś uruchomić dwa checkouty tego samego apphostu jednocześnie — powiedzmy main kontra gałąź funkcji, równoległe testy integracyjne, lub workflowy kierowane przez agenta — poczułeś ból. Losowe porty i odseparowane tajemnice oznaczają, że wreszcie możesz uruchomić N kopii i nie przejmować się.

Tylko dla drzew gitowych to jest warte aktualizacji. Dla zestawów testów integracyjnych, które uruchamiają prawdziwe usługi z natywnymi zależnościami (renderowanie Chrome dla generowania PDF-ów, Tesseract dla OCR, typowe ciężkie wagowe), to różnica między nietreściwym a niezawodnym.

Aspiruj do lekarza i aspiruj do opisu

aspire doctor działa przez twoje srodowisko: stan cert krót, wersja kontenera runtime, SDK .NET, konfiguracja WSL2, konfiguracja agenta. To jest ten rodzaj rzeczy, który powinien mieć każdy framework, a większość nie zadaje sobie trudu. Wyjście jest działowe. Gdy coś jest nie tak, mówi ci, co robić.

aspire describe --follow daje ci strumieniowy widok stanu zasobów z terminala. Te same dane, które pokazuje dashboard, ale z możliwością przekazywania. Wstaw to w panel tmux i dostajesz większość wartości dashboardu w 80 kolumnach.

Polecenia zasobów stały się bardziej przejrzyste

Stare polecenia resource-start / resource-stop / resource-restart są wycofane na korzyść czystszej formy podpolecenia:

aspire resource api restart
aspire resource api rebuild
aspire resource api restart
aspire resource api rebuild
SHELL

rebuild jest nowe. Zatrzymuje, buduje i uruchamia ponownie pojedynczy zasób projektu .NET bez rozładowania całej sesji apphost. Jeśli kiedykolwiek zmieniłeś jedną usługę w grafie 12-zasobowym i jęknąłeś przy ponownym uruchamianiu wszystkiego, to jest naprawa. Czuliśmy to sami: gdy iterujesz nad szablonem renderowania PDF-a lub dostosowujesz przetwarzanie wstępne OCR, restartowanie całego grafu tylko po to, aby przeładować jeden projekt szybko się starzeje.

Tajemnice i certyfikaty bez wychodzenia z CLI

Dwie nowe grupy poleceń:

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
SHELL

aspire secret to większe zwycięstwo. Mapuje się na ten sam magazyn sekretów użytkownika, który zasila AddParameter(..., secret: true) w modelu app, ale nie potrzebujesz zainstalowanego CLI .NET, aby nimi zarządzać. W poliglotowej apphost, gdzie nie każdy deweloper ma SDK .NET, ma to znaczenie.

Aspiruj czeka na CI

aspire wait api --status healthy --timeout 120
aspire wait api --status healthy --timeout 120
SHELL

Blokuj na stanie zasobu. W połączeniu z aspire start i --format json, możesz w końcu pisać skrypty CI, które czekają na rzeczy naprawdę gotowe zamiast sleep 30 && hope.

Konfiguracja: jeden plik, który rządzi wszystkimi

Aspiruj konsoliduje swoje pliki konfiguracyjne. Stary podział między .aspire/settings.json a apphost.run.json zniknął, zastąpiony przez jeden aspire.config.json w katalogu głównym projektu:

{
  "appHost": {
    "path": "apphost.ts",
    "language": "typescript/nodejs"
  },
  "sdk": { "version": "13.2.0" },
  "channel": "stable",
  "profiles": {
    "default": {
      "applicationUrl": "https://localhost:17000;http://localhost:15000"
    }
  }
}

Migracja jest automatyczna. Za pierwszym razem gdy uruchomisz jakiekolwiek polecenie aspire w istniejącym projekcie, starsze pliki zostaną scalone w nowy format z ścieżkami przeniesionymi do katalogu głównego projektu. Stare pliki są zachowane, więc możesz nadal używać starszych wersji CLI obok siebie. Globalne ustawienia (globalsettings.json) również są migrowane.

Jeśli masz automatyzację, która bezpośrednio kieruje na .aspire/settings.json lub apphost.run.json, zaplanuj jej przeniesienie.

TypeScript AppHost (wersja zapoznawcza)

To interesujące, nawet jeśli nie zamierzasz go używać od pierwszego dnia. Teraz możesz napisać swój apphost w TypeScript zamiast 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();

Pod maską, TS apphost działa jako proces gość rozmawiający z zarządzającym przez Aspire hostem orkiestrowania .NET przez JSON-RPC na lokalnym transporcie. Ten sam model zasobów, ten sam dashboard, te same integracje, tylko wyrażone w TypeScript.

Interesujący jest element generacji kodu. Gdy uruchomisz aspire add, CLI bada .NET assembly integracji i generuje SDK TypeScript w .modules/. aspire restore regeneruje je, przydatne po aktualizacji lub zmianie gałęzi (również uruchamiane automatycznie przy aspire run). Generator 13.2 dodał także cele testowe dla Go, Java i Rust, co sugeruje, dokąd to zmierza.

Dla zespołów w pierwszej kolejności .NET, jak nasze, jest to bardziej "obejrzyj to" niż "wprowadź to", ale wzorzec generacji kodu oznacza, że przyszłe poliglotowe języki apphost będą podążać tym samym modelem. Zobacz dokumentacja architektury wielojęzycznej aby dowiedzieć się, jak działa mostek hosta.

Dashboard: eksport/import telemetryczny to nowa zabawka

Dashboard dostał prawdziwy przepływ pracy eksportu/importu. Z Ustawienia → Zarządzaj, wybierz zasoby i typy telemetryczne, a następnie eksportuj je jako JSON w zipie. Później ponownie importuj do panelu sterowania lub przekaż je komuś innemu (lub LLM) do analizy.

Polecenie CLI aspire export generuje ten sam pakiet:

aspire export --output .\artifacts\aspire-export.zip
aspire export <resource>
aspire export --output .\artifacts\aspire-export.zip
aspire export <resource>
SHELL

Rzeczywiście przydatne do raportów błędów. Zamiast "oto kilka zrzutów ekranu i plik dziennika", możesz dołączyć migawkę aktualnego stanu telemetrii.

Inne notatki dotyczące strony dashboardu:

  • Teraz możesz ustawić parametry zasobów bezpośrednio z interfejsu użytkownika dashboardu, z opcją zapisania do tajemnic użytkownika
  • Zmienne środowiskowe mogą być eksportowane jako pliki .env z widoku szczegółów zasobów
  • Układ grafu zasobów używa adaptacyjnego pozycjonowania siłowego. Złożone wykresy są zauważalnie mniej zagracone
  • HTTP API Telemetrii na /api/telemetry zwraca OTLP JSON; obsługiwane ?follow=true dla strumieniowania NDJSON. Punkty końcowe obejmują zasoby, zakresy, logi i ślady (w tym /traces/{traceId} dla pełnego wyszukiwania śladów)

Samodzielny panel sterowania teraz domyślne ustawia API telemetryczne na wyłączone. Jeśli sam hostujesz dashboard i polegasz na API, potrzebujesz DASHBOARD__API__ENABLED=true plus konfiguracji uwierzytelniania (DASHBOARD__API__AUTHMODE i DASHBOARD__API__PRIMARYAPIKEY). Scenariusze zintegrowane z AppHost nadal działają, ponieważ Aspire.Hosting automatycznie łączy API w przypadku narzędzi.

Części modelu aplikacji warte uwagi

WithMcpServer

Możesz zadeklarować w modelu aplikacji, że zasób hostuje punkt końcowy 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")
$vbLabelText   $csharpLabel

Narzędzia Aspire mogą wtedy odkrywać i kierować ten punkt końcowy. Jeśli wydajesz cokolwiek, co eksponuje narzędzia dla agentów kodujących, to jest najczystszy sposób, aby to podłączyć. Obsługiwany niestandardowy ścieżkę lub nazwę punktu końcowego przez opcje.

Kontekstowa rozdzielczość punktu końcowego

Tego rodzaju rzeczy nie zauważasz, dopóki ich nie potrzebujesz. Punkty końcowe mogą być teraz rozwiązywane z perspektywy konkretnego dzwoniącego lub sieci:

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
})
$vbLabelText   $csharpLabel

Ten sam punkt końcowy Redis zostanie rozwiązany jako localhost:6379 z procesu hosta, host.docker.internal:6379 z kontenera na sieci hosta, lub cache:6379 z kontenera na sieci kontenerów Aspire, w zależności od kontekstu. Klasa KnownNetworkIdentifiers daje ci LocalhostNetwork, DefaultAspireContainerNetwork, i PublicInternet, jeśli wolisz wybierać sieć niż rozmówcę.

Notatki z wydania wyraźnie wskazują, że te API istniały w wersji 13.1, ale nie działały poprawnie. Więc jeśli napisałeś coś przeciwko nim w wersji 13.1, przetestuj ponownie. Pełne szczegóły w dokumentacji hierarchii zasobów.

Tajemnice budowy kontenera

WithSecretBuildArg zostało przemianowane na WithBuildSecret. Nowa nazwa jest bardziej przejrzysta. Te przepływają przez Docker/Podman jako właściwe tajemnice budowy, a nie jako argumenty budowy (które wyciekają do historii obrazów).

builder.AddContainer("worker", "contoso/worker")
    .WithDockerfile("../worker")
    .WithBuildSecret("ACCESS_TOKEN", accessToken);
builder.AddContainer("worker", "contoso/worker")
    .WithDockerfile("../worker")
    .WithBuildSecret("ACCESS_TOKEN", accessToken);
$vbLabelText   $csharpLabel

Sekrety budowania mogą teraz również być plikami (np. .npmrc dla prywatnego uwierzytelnienia rejestru w budowach kontenerów), które pokrywają większość rzeczywistych przypadków użycia.

Integracje: te, które mają znaczenie

Pełna lista jest długa. To są te, które bym zaznaczył:

  • Publikowanie Docker Compose jest teraz stabilne (było w wersji wstępnej). AddDockerComposeEnvironment generuje docker-compose.yaml z modelu aplikacji w momencie publikacji. Przydatny krok ucieczki, gdy "deploy to Azure" nie jest odpowiedzią. Warto zauważyć, jeśli dostarczasz kontenery zawierające natywne zależności, ponieważ IronPDF, IronOCR i IronXL wszystkie wspierają kontenery Linux i Docker czysto, więc wygenerowany plik komponujący zwykle działa bez ręcznej interwencji.
  • Integracja z Azure Virtual Network (Aspire.Hosting.Azure.Network) pozwala deklarować VNets, podsieci, NSG, bramy NAT i prywatne punkty końcowe w apphost. AddPrivateEndpoint automatycznie tworzy prywatne strefy DNS, łącza do sieci wirtualnych i wyłącza publiczny dostęp do celu. To jest ten rodzaj rzeczy, który wcześniej oznaczał utrzymywanie osobnego pliku Bicep.
  • Azure Data Lake Storage otrzymał zarówno hosting, jak i wsparcie klienta: AddDataLake, AddDataLakeFileSystem, plus AddAzureDataLakeServiceClient / AddAzureDataLakeFileSystemClient po stronie klienta. Rejestracja DI, ponowienia prób, kontrole zdrowia, telemetria, standardowa stos Aspire.
  • MongoDB EF Core ma nową integrację klienta (Aspire.MongoDB.EntityFrameworkCore). AddMongoDbContext<TContext> dla typowego przypadku lub EnrichMongoDbContext<TContext>(), jeśli sam rejestrujesz DbContext.
  • Inferencja AI Azure teraz obsługuje wpasowania, a nie tylko czat. Zarejestruj AddAzureEmbeddingsClient("embeddings").AddEmbeddingGenerator() i wstrzyknij IEmbeddingGenerator<string, Embedding<float>>. Dostępny jest również odmiana z kluczem.
  • Azure Container Registry otrzymał WithPurgeTask("0 1 * * *", ago: TimeSpan.FromDays(7), keep: 5), który udostępnia zadanie czyszczenia ACR zgodnie z harmonogramem cron.
  • Wsparcie dla Bun dla zasobów JavaScript przez WithBun(). Niezawodność Yarn z AddViteApp również została naprawiona dzięki WithYarn().
  • Microsoft Foundry zastępuje Azure AI Foundry. Aspire.Hosting.Foundry zastępuje Aspire.Hosting.Azure.AIFoundry. Zmiana łamiąca; szczegóły poniżej.

Składanie całości: usługa dokumentów w Aspire 13.2

Oto wzór, który stosujemy wewnętrznie do testowania rozproszonych scenariuszy z naszymi bibliotekami. Warto to pokazać, ponieważ większość nowych funkcji w wersji 13.2 ma sens w tego rodzaju złożonej konfiguracji wieloserwisowej, a nie w prostych demonstracjach.

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()
$vbLabelText   $csharpLabel

Co konkretnie otrzymujesz od 13.2:

  • aspire start --isolated pozwala uruchomić dwie kopie tego grafu obok siebie, bez kolizji portów. Przydatne przy porównywaniu gałęzi lub uruchamianiu równoległych testów integracji przeciwko renderującemu
  • aspire resource renderer rebuild przeładowuje tylko renderer PDF, gdy zmieniasz szablon Razor, zamiast ponownie uruchamiać cały graf
  • aspire wait renderer --status healthy --timeout 120 pozwala twojemu CI blokować się, aż renderowanie Chrome zostanie zainicjowane przed uruchomieniem testów generowania PDF
  • HTTP API telemetrii i aspire export dają ci zakresy w formacie OTLP dla każdego połączenia renderowania, co jest sposobem na rzeczywiste uchwycenie wolnej reguły CSS w ruchu produkcyjnym
  • WithMcpServer pozwala ci eksponować renderer jako narzędzie MCP dla przepływów pracy bazujących na agencie kodowania, przydatne, jeśli budujesz cokolwiek, co programowo generuje dokumenty

Jeśli chcesz zbudować usługę taką jak powyższy renderer, samouczek HTML na PDF IronPDF przeprowadza po stronie C#. Dla pracownika OCR, przewodnik po IronOCR obejmuje podstawy.

Zmiany łamiące, które naprawdę cię dotkną

W przybliżonym porządku, jak prawdopodobne są:

Nazewnictwo zmiennych środowiskowych usługi odkrywania

# 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
SHELL

Używany jest schemat punktu końcowego zamiast nazwy punktu końcowego. Jeśli masz jakiś kod lub konfigurację dopasowywaną do tych nazw zmiennych środowiskowych, zaktualizuj je. To jest najbardziej prawdopodobne ciche złamanie: nic nie wyrzuca błędu, zmienne po prostu mają różne klucze.

BeforeResourceStartedEvent

Wcześniej odpalany szerzej; teraz odpalany tylko, gdy faktycznie rozpoczyna zasób, a nie przy każdej zmianie stanu. Jeśli twój handler liczył na wcześniejsze zachowanie, przestanie działać po cichu.

AIFoundry do Foundry

Zmiana nazwy pakietu i API. Zaktualizuj odniesienie do pakietu i wywołania:

<PackageReference Include="Aspire.Hosting.Foundry" Version="13.2.0" />
<PackageReference Include="Aspire.Hosting.Foundry" Version="13.2.0" />
XML
// 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)
$vbLabelText   $csharpLabel

RunAsFoundryLocal nadal działa dla lokalnego rozwoju modelu, ale Projekty Foundry nie są obsługiwane, gdy zasób nadrzędny jest skonfigurowany jako Foundry Local.

Domyślne poświadczenie Azure

Aspire Azure klient integracje nie używają już konstruktora DefaultAzureCredential bez parametrów. Jeśli polegałeś na poświadczeniach innych niż ManagedIdentityCredential, które działają w usłudze Azure, zmienia się zachowanie. Przeczytaj domyślną dokumentację poświadczeń Azure przed aktualizacją wersji produkcyjnej.

Zmiana nazwy polecenia zasobu

resource-start / resource-stop / resource-restart są teraz aspire resource <name> start|stop|restart. Zaktualizuj wszelkie skrypty. Opcja --apphost jest teraz preferowana zamiast starego --project (który nadal jest akceptowany).

Sufiks właściwości połączenia

Dodano sufiks właściwości połączenia. Jeśli bezpośrednio uzyskujesz dostęp do właściwości połączenia (zamiast przez WithReference), sprawdź, czy twój kod nadal je rozwiązuje.

WithSecretBuildArg do WithBuildSecret

Wspomniane powyżej. Prosta zmiana nazwy.

IAzureContainerRegistry przestarzałe

Użyj właściwości ContainerRegistry zamiast tego w środowiskach obliczeniowych.

Telemetria Dashboard API teraz opcjonalna (samodzielna)

Już omówione powyżej, ale warto powtórzyć: samodzielne wdrożenia dashboard muszą teraz wyraźnie włączyć API.

Czy powinieneś zaktualizować?

Dla działającego sklepu .NET z uruchamianiem aplikacji wieloserwisowych lokalnie, tak, o ile zinwentaryzowałeś powyższe zmiany łamiące. Same ulepszenia CLI czynią to wartym zachodu. Tryb odłączony i tryb izolowany w szczególności rozwiązują rzeczywiste problemy z przepływem pracy.

Dla użytkowników Foundry: zmiana nazwy to wymuszona migracja, jeśli chcesz cokolwiek nowego z tego wydania, więc planuj odpowiednio.

Dla osób zaciekawionych TypeScript: 13.2 to pierwsze wydanie, w którym TS apphost jest na tyle realny, by ocenić. Wciąż podgląd, ale warto poświęcić piątkowe popołudnie.

Sama aktualizacja jest jednowierszowa, jeśli już jesteś na 13.x:

aspire update --self
aspire update
aspire update --self
aspire update
SHELL

Jeśli jesteś na 12.x lub wcześniejszej, sięgnij po przewodnik aktualizacji najpierw. Jest krok 13.0, którego nie można pominąć.

Notatka o poprawkach: 13.2.1

13.2.1 zostało wysłane od pierwotnego wydania z poprawkami niezawodno Jest mała zmiana nazwy SDK TypeScript warta odnotowania, ma znaczenie tylko, jeśli już jesteś na TS apphost w podglądzie:

PoprzednieNowe
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 jest zachowane jako alias zgodności w wygenerowanych SDK, więc nie jest to przerwa w czasie działania.

Budowanie rozproszonych aplikacji .NET z obciążeniami dokumentowymi?

Jeśli twoje usługi wykonują generację PDF, OCR, przetwarzanie Excela, kody kreskowe lub inne formaty, które obejmujemy, nasze biblioteki są zaprojektowane dokładnie dla tego rodzaju ustawień wieloserwisowych przyjaznych kontenerom, które Aspire organizuje. Wszystko obsługuje .NET 10, 9, 8, 7, 6, Framework i Core, i działa w kontenerach Linux, Azure, AWS i lokalnie.

Kilka miejsc, od których można zacząć:

  • IronPDF dla HTML do PDF, edycji PDF, podpisywania i formularzy. Centrum samouczków to najszybsza droga do działającej usługi renderującej
  • IronOCR do ekstrakcji tekstu z obrazów i PDF w ponad 125 językach
  • IronXL do odczytu i zapisu Excela bez Office Interop
  • IronWord do generowania i edycji DOCX
  • IronBarcode i IronQR do generowania i skanowania kodów kreskowych oraz QR
  • Iron Suite jeśli potrzebujesz czegoś więcej niż powyższe

Możesz zdobyć 30-dniowy klucz próbny i mieć działającą usługę PDF lub OCR działającą w aplikacji Aspire w mniej niż godzinę. Jeśli napotkasz coś dziwnego, nasza ekipa wsparcia to prawdziwi inżynierowie, nie kolejka triage do zgłoszeń.

To wszystko. Do zobaczenia przy kolejnym wydaniu.