Görüntüleyicinin Nasıl Çalıştığı

Belge isteği yaşam döngüsü

Doconut, belgeleri sayfalı görüntüler olarak işler ve bunları Web.config dosyanızın kaydettiği bir HTTP işleyicisi aracılığıyla sunar. Yaşam döngüsünü — açma, belirteç, sayfa istekleri, kapatma — anlamak, gözlemleyeceğiniz neredeyse tüm davranışları, hata mesajları dahil, açıklar.

Hareketli Parçalar

  • Viewer — DoconutHost.Services üzerinden çözdüğünüz genel hizmet. Belgeleri açar ve oturum belirteçleri döndürür.
  • Belge oturumu — yüklü belgeyi tutan, belirteci altında bellekte saklanan sunucu tarafı nesne.
  • DocImage.axd — Web.config içinde bildirilen Doconut.DocImageHandler. Tarayıcı widget'ının yaptığı her isteğe (sayfalar, küçük resimler, arama, açıklamalar, …) yanıt verir ve her zaman belirteç ile tanımlanır.
  • /doconut-res/* — widget'ın kendi betiklerini, stillerini ve simgelerini sunan Doconut.DoconutResourceModule.

Viewer durum bilgisizdir — tasarım gereği

Viewer, istek başına belge durumu tutmaz ve IDisposable uygulamaz. Oturumlar ondan bağımsız olarak yaşar ve süresi dolma ya da açık bir CloseDocument(token) ile temizlenir. System.Web'de yapılandırıcı enjeksiyonu yoktur, bu yüzden ihtiyacınız olduğunda çözün — genellikle bir denetleyici eyleminde:

csharp
// POST /ViewerApi/Open?fileName=Sample.pdf
[HttpPost]
public async Task<ActionResult> Open(string fileName)
{
    var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
    var path   = Server.MapPath("~/files/" + Path.GetFileName(fileName));

    var token = await viewer.OpenDocumentAsync(path);
    return Content(token, "text/plain");
}

OpenDocumentAsync içinde ne olur

  1. Lisans kapısı. Reddedilen bir lisans (değiştirilmiş, kara listeye alınmış veya lisansın güncelleme penceresi dışındaki bir yapı) hemen LicenseException fırlatır ve nedeni mesaj olarak verir. Açma işlemi, geçersiz bir lisans için asla sessizce bozulmaz; eksik bir lisans sadece filigran ekler.
  2. Oturum oluşturma. Görüntüleyici fabrikası dosya uzantısı için uygun format görüntüleyicisini seçer ve belgeyi yükler (bkz. Renderleme Boru Hattı). Oturum, kaydırmalı süresi dolma özelliğiyle DocOptions.TimeOut dakika (varsayılan 60) süren yeni rastgele bir belirteç altında bellekte saklanır. Her sayfa isteği saati sıfırlar.
  3. Erişim izni. UnsafeMode = false (varsayılan) olduğunda, belirteç belgeyi açan isteğin ASP.NET oturumuna bağlanır: o oturuma bir secure-{token} girişi yazılır. Bu nedenle açma işlemi oturum durumu olan bir istekte çalışmalıdır — bkz. Oturumlar ve Güvenlik.
  4. Belirteç döndürülür. Tarayıcının sonraki tüm işlemler için ihtiyaç duyduğu tek tanımlayıcı budur.

Asenkron aşırı yüklemeler bir dosya yolu, bir dosya yolu artı format başına yapılandırma (PdfConfig, WordConfig, …) veya uzantısı formatı seçen bir FileInfo ile birlikte bir Stream alır. Asenkron sayfalar kullanmayan Web Forms kod-arkası için OpenDocument, aynı üç girişi senkron olarak sunar (bir yol, bir dosya adıyla akış veya bir dosya adıyla bayt dizisi).

Widget sayfaları nasıl alır

Widget, sorgu dizesinde belirteç ile DocImage.axd'yi çağırır. İşleyicinin yaptığı, isteğe bağlıdır:

SorguAmaç
?token=…&page=NRender edilmiş sayfa görüntüsü (PNG)
?token=…&page=N&thumb=1Küçük resim
?token=…&zoom=…Yakınlaştırılmış sayfa render'ı
?token=…&search=termTam metin arama (lisans kontrollü)
?token=…&bookmarksBelge taslağı ve yer imleri
?token=…&copy / &showlinks / &fileFormat / &metaMetin kopyalama, hiperlinkler, format bilgisi, DICOM meta verileri
?token=…&action=rotate/flip/closeSayfa eylemleri ve açık kapatma (POST)
?token=…&AnnSave=… / &AnnLoadAçıklamaları kaydet ve yükle

Her istek önce kontrol edilir:

  • Belirteç yok → 404, veya ShowDoconutInfo = true olduğunda bir sürüm banner'ı.
  • Belirteç bu ASP.NET oturumuna verilmemiş → You Are Not Authorized To View This Page. metnini içeren bir hata görüntüsü.
  • Bilinmeyen veya süresi dolmuş belirteç → Document session not found. Please re-open document. metnini içeren bir hata görüntüsü.

Hata görüntüleri, 200 durum kodu ile gönderilen sıradan PNG'lerdir, böylece widget bunları sayfanın olması gereken yerde gösterebilir. Yalnızca durum koduna bakan bir izleme kontrolü, bunları sunulan sayfalar olarak raporlayacaktır; gerçek bir sayfa onlarla yüzlerce kilobayt iken, hata görüntüsü yaklaşık 2 KB'dir.

Bir belgeyi kapatma

csharp
viewer.CloseDocument(token);

CloseDocument, oturumu (belge motorunu ve belleğini hemen serbest bırakarak) kaldırır, mevcut isteğin ASP.NET oturumundan secure-{token} girişini siler ve belirteci iptal eder. İsteğe bağlıdır — kaydırmalı süresi dolma aynı temizlik işlemini yapar — ancak büyük belgeler için kullanıcı işi bitirir bitirmez belleği serbest bırakır. Tarayıcıdan, objViewer.Close(true) eşdeğer kapatma isteğini DocImage.axd'ye gönderir.

Çıkarımlar

  • Bir açık belge = bir oturum = bir belirteç, belgeyi açan ASP.NET oturumuna verilir.
  • Belirteç, kaydırmalı bir pencere içinde süresi dolar; DocOptions.TimeOut süresinden uzun süre boşta kalan bir görüntüleyici yeniden açılmalıdır.
  • Viewer serbestçe çözümlenebilir ve paylaşılabilir; oturumlar tüm durumu taşır.

Bu sayfa yardımcı oldu mu?