Görünümün Nasıl Çalıştığı
Belge isteği yaşam döngüsü
Doconut, belgeleri ASP.NET Core ara katmanı aracılığıyla sunulan sayfalı görüntüler olarak işler. Yaşam döngüsünü — açma, belirteç, sayfa istekleri, kapama — anlamak, gözlemleyeceğiniz hemen hemen tüm davranışları, hata mesajları dahil, açıklar.
Üç Hareketli Parça
Viewer— enjekte ettiğiniz genel hizmet. Belgeleri açar ve oturum belirteçleri döndürür.- Belge oturumu — yüklü belgeyi tutan,
IMemoryCacheiçinde bir belirteçle anahtarlanan sunucu tarafı nesne. - Doconut ara katmanı —
UseDoconut()tarafından eklenir; tarayıcı widget'ının yaptığı her isteğe (pages,thumbnails,search,annotations, …) yanıt verir, her zaman belirteçle kimlik doğrulanır.
Viewer durumsuz — tasarım gereği
Viewer kapalıdır, istek başına belge durumu tutmaz ve kasıtlı olarak IDisposable'ı değil uygular. Oturumlar, oturum yöneticisinde bağımsız olarak yaşar ve önbellek süresi dolması ya da açık bir CloseDocument(token) ile temizlenir.
Artık onu oluşturmazsınız. AddDoconut(), onu geçici bir hizmet olarak kaydeder; ihtiyacınız olan her yerde enjekte edin:
app.MapPost("/api/open", async (string fileName, Viewer viewer) =>
{
var token = await viewer.OpenDocumentAsync($"files/{fileName}");
return Results.Content(token, "text/plain");
});Bir MVC uygulamasında, onu bir yapıcı parametresi olarak alın; bir Razor görünümünde, @inject Doconut.Viewer Viewer kullanın. Viewer örneklerinin uygulama sahipliğindeki önbellekleri artık gerekli değil — ve artık doğru da değil, çünkü önbelleğe değer bir şey tutmazlar.
OpenDocumentAsync içinde ne olur
- Lisans kapısı. Reddedilen ya da sürüm süresi dolmuş bir lisans (kara listeye alınmış, değiştirilmiş veya lisansın güncelleme penceresinin dışında bir yapı) hemen bir
LicenseExceptionfırlatır, reddetme nedeni mesaj olarak verilir — açma işlemi, geçersiz (eksik olmayan) bir lisans için asla sessizce bozulmaz. Takvim süresi dolmuş Geçici ya da abonelik lisansı istisnadır: throw etmeyip — bir filigrana bozulur. - Oturum oluşturma. Görüntüleyici fabrikası, dosya uzantısı için doğru format görüntüleyiciyi seçer ve belgeyi yükler (Rendering Pipeline'a bakın). Oturum, yeni bir GUID belirteciyle
IMemoryCacheiçinde saklanır ve kaydırmalı süresi dolma —DocOptions.TimeOutdakika, varsayılan 60. Her sayfa isteği saati sıfırlar. - Güvenlik kaydı.
UnsafeMode = false(varsayılan) ile belirteç, çağıranın ASP.NET oturumuna bağlanır: oturuma birsecure-{token}işareti yazılır, böylece belgeyi açan tarayıcı oturumu dışında kimse sayfalarını isteyemez. - Belirteç döndürülür. Sonraki tüm işlemler için tek kimlik bilgisi budur.
Ayrı bir ısınma adımı yoktur. Önceki kütüphane bu amaçla InitCache()'ı sunuyordu; artık mevcut değil ve yerine bir şey gelmiyor.
Üç aşırı yükleme yalnızca girdi bakımından farklıdır: bir dosya yolu, bir dosya yolu artı format başına yapılandırma (PdfConfig, WordConfig, …), ya da uzantısı format algılamasını yönlendiren bir Stream artı bir FileInfo.
Widget'ın Sayfaları Nasıl Aldığı
İstemci widget'ı, sorgu dizesinde belirteçle Doconut ara katmanını çağırır. Ara katmanın yaptığı, isteğe bağlıdır:
| Sorgu | Amaç |
|---|---|
?token=…&page=N | Oluşturulmuş sayfa görüntüsü (PNG) |
?token=…&page=N&thumb=1 | Küçük resim |
?token=…&zoom=… | Yakınlaştırılmış sayfa render'ı |
?token=…&search=term | Tam metin arama (lisans kontrollü) |
?token=…&bookmarks | Belge taslağı/yer imleri |
?token=…© / &showlinks / &fileFormat | Metin kopyalama, hiperlinkler ve format bilgisi |
?token=…&meta | DICOM teknik meta verileri; bu paket üzerindeki bir DICOM oturumu için 501 döndürür |
?token=…&action=rotate/flip/close | Sayfa eylemleri ve açık kapatma |
?token=…&AnnSave=… / &AnnLoad | Ek açıklamaları kaydet/yükle |
Bu yolların her biri önce doğrulanır:
- Belirteç yok → ara katman 404 döndürür (veya
ShowDoconutInfo = trueolduğunda bir sürüm banner'ı). - Bilinmeyen veya süresi dolmuş belirteç →
Document session not found. Please re-open document.içeren bir hata görüntüsü - Oturum ara katmanı eksik (
UnsafeMode = falseile) →Session middleware not configured. Call UseSession() before UseDoconut().içeren HTTP 500 - Belirteç farklı bir tarayıcı oturumu tarafından açıldı →
You Are Not Authorized To View This Page.içeren bir hata görüntüsü
Ara katmanın Bağlandığı Yer
UseDoconut(), bir belirteç taşıyan istekleri yanıtlar, nerede bağlarsanız bağlayın. Referans uygulama, tarihsel DocImage.axd istek şeklini bir MapWhen dalında tutar, böylece mevcut istemci her zaman olduğu gibi URL'yi çağırmaya devam eder. Ne seçerseniz seçin, istemcinin BasePath'ı bununla uyumlu olmalıdır — bkz. ViewerConfig.
Sayfaları açma düğümü yerine paylaşımlı depolamadan sunmak tamamen farklı bir düzenlemedir; bkz. Distributed Deployments.
Bir Belgeyi Kapatma
viewer.CloseDocument(token);CloseDocument, oturumu önbellekten kaldırır (bu, temel belge motorunu yok eder ve belleğini hemen serbest bırakır), secure-{token} işaretini siler ve erişim iznini iptal eder. Çağırmak isteğe bağlıdır — kaydırmalı süresi dolma aynı temizlik işlemini otomatik yapar — ancak büyük belgeler için, kullanıcı işini bitirdiği anda belleği serbest bırakmanın nazik yolu budur.
Bu, enjekte edilen Viewer üzerinde çağrılır. Önceki desen — bir Viewer'ı bir using bloğunda sadece bir belirteci kapatmak için kısa ömürlü oluşturmak — eşdeğeri yoktur ve gerekmez.
Çıkarımlar
- Bir açık belge = bir oturum = bir belirteç. Belirteçler tarayıcı oturumu başına, küresel URL'ler değil.
- Belirteç, kaydırmalı bir pencere içinde süresi dolar;
DocOptions.TimeOut'ı aşan bir görüntüleyici yeniden açılmaya ihtiyaç duyar. Viewerenjekte edilebilir ve serbestçe paylaşılabilir; oturumlar tüm durumu taşır.
Bu sayfa yardımcı oldu mu?