Sist endret: 29. okt. 2026
Preview: Dette er dokumentasjonen for Altinn Studio v9, som er en forhåndsversjon. Gjeldende versjon er v8. For å se dokumentasjonen for gjeldende versjon, velg v8 i versjonsvelgeren i menyen til venstre.

Sende hendelser til Altinn Events

Slik slår du på hendelsene appen sender selv, og slik sender du dine egne hendelser til Altinn Events

Appen kan sende hendelser til Altinn Events når noe skjer med en instans, for eksempel når brukeren sender inn skjemaet. Andre systemer, for eksempel fagsystemet deres, kan abonnere på hendelsene og hente dataene når de er klare.

I v9 kan appen bare sende hendelser, ikke ta imot dem. Trenger du at appen venter på svar fra et annet system, se Hvis du tok imot hendelser i v8.

Hendelsene appen sender selv

HendelseNår appen sender den
app.instance.creatednår en ny instans er opprettet
app.instance.process.movedTo.{taskId}når prosessen går til en ny oppgave, for eksempel app.instance.process.movedTo.Task_2
app.instance.process.completednår prosessen er ferdig
app.instance.substatus.changednår tjenesteeieren endrer substatusen på instansen

Appen sender ikke disse hendelsene før du slår dem på. Sett RegisterEventsWithEventsComponent til true i AppSettings:

App/appsettings.json
{
  "AppSettings": {
    "RegisterEventsWithEventsComponent": true
  }
}

Appmalen har innstillingen med verdien false. Endre verdien som står der.

De tre første hendelsene sender appen ved siden av prosessen. Feiler sendingen, prøver appen igjen uten at prosessen stopper. Hendelsen om substatus sender appen med en gang. Feiler den, prøver ikke appen igjen.

Sende dine egne hendelser

Med IEventsClient kan du sende en hendelse med et navn du velger selv, for eksempel når et bestemt steg i prosessen er ferdig. Appen sender disse hendelsene uansett hva RegisterEventsWithEventsComponent står på.

AddEvent tar navnet på hendelsen og instansen den gjelder:

Task<string> AddEvent(
    string eventType,
    Instance instance,
    StorageAuthenticationMethod? authenticationMethod = null,
    Guid? idempotencyKey = null,
    CancellationToken cancellationToken = default
);
  • authenticationMethod bestemmer hvem appen sender hendelsen som. Standard er brukeren som er logget inn. Kjører koden i prosessmotoren, der det ikke finnes noen innlogget bruker, sender appen hendelsen som tjenesteeieren.
  • idempotencyKey sørger for at Altinn Events bare registrerer én hendelse selv om appen sender den flere ganger med samme nøkkel. Nøkkelen gjelder på tvers av alle hendelser, så den må være unik for hver hendelse og instans. Bruker du GUID-en til instansen som nøkkel, kan du bare sende én hendelse for den instansen.
  • Metoden returnerer ID-en til hendelsen. Feiler sendingen, kaster den PlatformHttpException.

Eksempelet sender en hendelse når prosessen er ferdig:

App/logic/SendFerdigEvent.cs
using System.Security.Cryptography;
using System.Text;
using Altinn.App.Core.Features;
using Altinn.App.Core.Features.Process;
using Altinn.App.Core.Internal.Events;
using Altinn.Platform.Storage.Interface.Models;

public sealed class SendFerdigEvent(IEventsClient eventsClient) : IOnProcessEndedHandler
{
    private const string EventType = "app.instance.saksbehandling.klar";

    public async Task<HandlerResult> Execute(OnProcessEndedContext context)
    {
        Instance instance = context.InstanceDataMutator.Instance;
        Guid idempotencyKey = new(MD5.HashData(Encoding.UTF8.GetBytes($"{EventType}/{instance.Id}")));

        await eventsClient.AddEvent(
            EventType,
            instance,
            StorageAuthenticationMethod.ServiceOwner(),
            idempotencyKey,
            context.CancellationToken
        );

        return HandlerResult.Success();
    }
}
App/Program.cs
using Altinn.App.Core.Features.Process;

void RegisterCustomAppServices(
  IServiceCollection services,
  IConfiguration config,
  IWebHostEnvironment env
)
{
  services.AddTransient<IOnProcessEndedHandler, SendFerdigEvent>();
}

Appen kan bare ha én IOnProcessEndedHandler. Prosess-hooken kan kjøre flere ganger hvis noe feiler. Derfor lager eksempelet nøkkelen ut fra navnet på hendelsen og ID-en til instansen. Da får hendelsen samme nøkkel hver gang hooken kjører for samme instans, og Altinn Events registrerer den bare én gang. Se Prosess-hooks for mer om hookene.

Hendelsen inneholder ikke skjemadataene. Den sier hvilken instans det gjelder, og hvem som eier den. Den som abonnerer, henter dataene fra instansen.

Abonnere på hendelsene

Abonnementet setter mottakeren opp i Altinn Events, ikke i appen. Se Abonnere på hendelser.

Altinn Events lover ikke at hendelsene kommer i riktig rekkefølge, eller at hver hendelse kommer bare én gang. Mottakeren må tåle at samme hendelse kommer flere ganger, og at en senere hendelse kommer før en tidligere.

Hvis du tok imot hendelser i v8

I v8 kunne appen ta imot hendelser gjennom IEventHandler og endepunktet eventsreceiver. I v9 er dette fjernet, sammen med IEventsSubscription og EventsSubscriptionClient. studioctl app upgrade v9 sier fra hvis appen bruker noe av dette, men endrer ikke koden for deg.

Hva du gjør i stedet, kommer an på hva appen brukte hendelsene til:

  • Appen abonnerte på sine egne hendelser for å gjøre noe senere. Legg arbeidet i en systemoppgave i prosessen i stedet. Se Systemoppgaver.
  • Appen ventet på svar fra et annet system. La systemoppgaven vente på svaret. Den kan spørre igjen etter en pause, eller ta imot svaret som en melding i en postkasse. Svaret kommer da inn gjennom et endepunkt dere lager selv i appen. Se Systemoppgaver med flere steg.

Å sende hendelser fungerer som i v8. AddEvent(eventType, instance) virker som før. De nye parameterne er valgfrie.

Spørsmål du kan stille utviklerne

  • Hvilke systemer abonnerer på hendelsene fra appen, og hvilke hendelser trenger de?
  • Har vi slått på RegisterEventsWithEventsComponent i appen?
  • Tok appen imot hendelser i v8, og hva gjør den i stedet nå?