ASP.NET Core

Tre chiamate middleware, non una riscrittura

Doconut è registrato nello stesso modo in cui tutto il resto in ASP.NET Core è registrato: un servizio nel contenitore e middleware nella pipeline. Eredita la tua autenticazione, il tuo logging, il tuo grafo DI e la tua storia di distribuzione, perché viene eseguito all'interno di essi piuttosto che accanto a essi.

3
chiamate middleware da integrare
75
estensioni di file pronte all'uso
2
obiettivi di distribuzione: Windows, Docker

Il problema

Il costo di integrazione che nessuno prevede

La maggior parte dei visualizzatori di documenti arriva come servizio separato. Ciò significa una seconda unità di distribuzione, un secondo set di credenziali, un salto di rete attraverso il quale i tuoi documenti ora viaggiano, e una seconda cosa di cui svegliare qualcuno alle 2 del mattino.

Doconut è una libreria. AddDoconut() la inserisce nella tua collezione di servizi; UseDoconut() la inserisce nella tua pipeline. Funziona sotto l'identità del tuo processo, legge la tua configurazione, scrive nel tuo logger e viene distribuita da ciò che già distribuisce la tua applicazione.

La conseguenza pratica è che l'autorizzazione rimane dove deve essere. Chiami OpenDocumentAsync() dopo il tuo controllo dei permessi, e il visualizzatore può rendere solo ciò che hai deciso di fornirgli.

Funzionalità

Cosa ti offre il middleware

Razor Pages, MVC e API minime

Il visualizzatore non è legato a uno stile di hosting. Renderizza il div di montaggio da una vista Razor o da una pagina statica e apri il documento da un'azione del controller, da un gestore di pagina o da un endpoint mappato.

La tua autenticazione, invariata

Poiché gli endpoint vivono nella tua pipeline, [Authorize] funziona come sempre. Non c'è un secondo sistema di identità con cui federarsi.

Sicurezza dei documenti basata su sessione

La sicurezza dei documenti si basa sullo stato di sessione di ASP.NET, motivo per cui UseSession() deve essere registrato prima di UseDoconut(). Significa che la nozione di chi sei del visualizzatore è la stessa dell'applicazione.

Pronto per il web farm

Più nodi dietro un bilanciatore di carico condividono la cache di rendering, così una sessione aperta su un nodo continua a funzionare quando la richiesta successiva arriva altrove.

Windows o Docker

IIS, Kestrel o un'immagine container che costruisci tu stesso. Nulla dell'integrazione cambia tra loro, tranne dove il file di licenza è montato.

Conversione nella stessa pipeline

Con il plugin Converter, DocumentConverter.ConvertAsync() viene eseguito nello stesso processo — nessun secondo servizio, nessun upload temporaneo, nessun round trip.

Integrazione

Registrazione e un endpoint aperto

UserMayRead e ResolvePath sono il tuo codice. Questo è il punto: Doconut non scopre mai quali documenti esistono o chi è autorizzato a vederli.

Piattaforme supportate

Razor PagesMVCMinimal APIs.NET 8.NET 6WindowsDocker
csharp
// Program.cs
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession(); // document security rides on session state

var app = builder.Build();

app.UseSession();          // call UseSession() before UseDoconut()
app.UseDoconutResources(); // must be registered before UseDoconut()
app.UseDoconut();

// Open the document server-side, behind your own authorization
app.MapPost("/api/open", async (Viewer viewer, HttpContext ctx, string documentId) =>
{
    if (!await ctx.UserMayRead(documentId))
        return Results.Forbid();

    // The token is opaque — hand it to the widget, never log or persist it.
    string token = await viewer.OpenDocumentAsync(ResolvePath(documentId));
    return Results.Ok(new { token });
}).RequireAuthorization();

Dettagli

Ordine di registrazione e insidie

  • UseSession() deve essere chiamato prima di UseDoconut(). La sicurezza dei documenti dipende da esso.
  • UseDoconutResources() deve essere chiamato prima di UseDoconut() e dovrebbe trovarsi dietro la stessa autenticazione del resto dell'app.
  • La vista Razor inietta Doconut.Viewer ed emette ReferenceCss / ReferenceScripts; jQuery deve essere caricato prima degli script del visualizzatore.
  • Imposta options.LicensePath dalla configurazione così il file di licenza può essere montato come segreto invece di essere incorporato nell'immagine.

Domande frequenti

Funziona con .NET 6 così come con .NET 8?

Sì. Entrambi sono supportati e utilizzano la stessa architettura DI più middleware. Ci sono pagine dedicate per ciascuno se hai bisogno di dettagli specifici per versione.

Esiste un componente Razor o un tag helper?

No, ed è intenzionale. L'integrazione è sempre middleware più il widget JavaScript, il che mantiene la stessa integrazione valida su Razor Pages, MVC, Web Forms e Blazor invece di frammentarsi in quattro.

Come si comporta dietro un bilanciatore di carico?

Il web farm e la distribuzione distribuita sono supportati tramite una cache di rendering condivisa. Un documento aperto su un nodo rimane leggibile quando le richieste successive arrivano su un altro.

Devo installare Office sul server?

No. Il rendering è nativo — non c'è interop con Office, nessun Word headless e nessuna automazione COM da gestire.

Provalo con i tuoi documenti

Una licenza temporanea richiede pochi minuti per essere richiesta e funziona interamente sul tuo computer. I file che contano sono quelli che già interrompono il tuo visualizzatore corrente.