.NET Standard 2.1'e Geçiş

Mevcut bir Doconut.NETStandard uygulamasını 26.7.0'dan 26.8.0'a taşıyın

Doconut iki ayrı .NET Standard entegrasyonuna sahiptir. Aynı Doconut.NETStandard paket adını kullandıkları için, paketleri, başlangıç ayarlarını, lisansları veya tarayıcı kaynaklarını değiştirmeden önce sürüm ve uygulamadaki API'lere bakarak nesli belirleyin.

Sürüm yol ayrımıdır

Her iki nesil de aynı paket kimliği altında yayınlanır. Sadece sürüm onları ayırır:

SürümHedefAPI
26.7.0 ve altınetstandard2.0önceki API
26.8.0 ve üstünetstandard2.1mevcut API

Sürüm numarasını artırmak yükseltmedir. Yüklemeniz gereken ayrı bir paket yoktur ve uyumluluk köprüsü de yoktur — 26.8.0 farklı bir API yüzeyine sahiptir. Artırmadan sonra derleme hataları bekleyin; bu rehberin geri kalanı bu hataların listesidir.

Hangi entegrasyonu kullanıyorsunuz?

Proje şunları içeriyorsa…Nesil
new Viewer(_cache, _accessor, ...)Önceki
viewer.OpenDocument(...) (synchronous)Önceki
viewer.InitCache()Önceki
UseDoconut(new DoconutOptions { ... })Önceki
UseDoconutWebFarm(...) / WebFarmOptionsÖnceki
Viewer.DoconutLicense(...) veya Viewer.SetLicensePlugin(...)Önceki
viewer.Converter.GetConverter()Önceki
using Doconut.Configs; / using Doconut.Models;Önceki
Manuel olarak kopyalanmış docViewer.js, documentLinks.js veya docViewer.UI.jsÖnceki
builder.Services.AddDoconut(...)Mevcut
app.UseDoconutResources() ve app.UseDoconut() argümansızMevcut
Bağımlılık enjeksiyonu ile sağlanan ViewerMevcut
await viewer.OpenDocumentAsync(...)Mevcut

Eğer her iki sütun aynı uygulamada bulunuyorsa, geçişi eksik olarak değerlendirin. Bir belge belirtecini diğer nesilden gelen kaynaklar veya middleware aracılığıyla göndermeyin.

Önce host çerçevesini kontrol edin

Bu bir tercih değil, katı bir engeldir. Mevcut paket netstandard2.1 hedefler:

Host26.8.0'ı tüketebilir mi
.NET Core 3.0 ve üzeri ( .NET 5/6/7/8 dahil )Evet
.NET Framework, herhangi bir sürümHayır

.NET Framework bir netstandard2.1 kütüphanesine referans veremez. Uygulama .NET Framework üzerinde çalışıyorsa, burada durun ve bunun yerine Doconut.NETFramework paketini kullanın; 26.9.0'dan itibaren .NET Framework 4.7.2 gerektirir. Bu sürüm için referans uygulamaları net8.0 hedeflemektedir.

Taşıma öncesi

  1. Mevcut uygulamanın bir dalını ve dağıtılabilir bir yedeğini oluşturun.
  2. Tam çekirdek ve eklenti paket sürümlerini kaydedin.
  3. Her new Viewer(...) çağrısını, InitCache() çağrısını, lisans yükleme çağrısını, UseDoconutWebFarm eşlemesini, dönüşüm denetleyicisini, kopyalanmış Doconut betiğini, özel araç çubuğu eylemini, viewer geri çağrısını ve belge‑açma uç noktasını envantere alın.
  4. Mevcut .lic dosyalarını ve dağıtım gizli anahtarlarını kaynak kontrolünün dışında koruyun.
  5. PDF, Office, görüntü, CAD, e‑posta, DICOM, aranabilir, şifre korumalı ve açıklamalı belgelerden temsilci bir set yakalayın.
  6. Mevcut oturum zaman aşımını, güvenlik davranışını, yazı tiplerini ve platform ayarlarını kaydedin.

Üretimi değiştirmeden önce bir ortamı taşıyın. Mevcut entegrasyon hizmet ömrünü, istek yönlendirmesini, oturum sahipliğini, istemci kaynak teslimini ve — bir çiftlik çalıştırıyorsanız — sayfaların tarayıcıya nasıl ulaştığını değiştirir.

1. Ad alanları: neredeyse her şey köke taşındı

Yapılandırma tipleri dört ad alanına yayılmıştı. Şimdi hepsi Doconut içinde.

ÖnceŞimdi
using Doconut.Configs.View;using Doconut;
using Doconut.Models;using Doconut;
using Doconut.Configs;using Doconut;
using Doconut.Configs.Cloud;using Doconut.Clouds;
using Doconut.Configs.Conversion;değişmedi
using Doconut.Middleware;değişmedi

Tip adları değişmedi: WordConfig, PdfConfig, ExcelConfig, CssConfig, ScriptConfig, CloudUploadConfig, AzureConfig, CDNConfig, FileShareConfig ve geri kalanları hâlâ mevcuttur. Çoğu dosyada tüm düzenleme iki using satırını silmekten ibarettir.

Doconut.Configs.Editor (BaseConfigEditor, PdfConfigEditor) kaldırıldı ve bu pakette bir ikamesi yoktur. Uygulamanız bu tipleri referans veriyorsa, bu bölümü ayrı planlayın ve geçişin bir parçası olarak değerlendirmeyin.

2. Paket ve lisans uyumluluğu

Temel paketi kasıtlı olarak değiştirin veya güncelleyin; yeni API'yi seçmek için aynı paket kimliğine güvenmeyin. Varsayılan komut en son kararlı sürümü kurar:

bash
dotnet add package Doconut.NETStandard

Bu kılavuz tarafından denetlenen sürüme tekrarlanabilir bir geçiş için, sürümü ayrı bir seçenek olarak geçirin:

bash
dotnet add package Doconut.NETStandard --version 26.8.0

Her Doconut eklentisini temel paketle aynı sürümde tutun — Doconut.NETStandard.Converter ve Doconut.NETStandard.Dicom. Mevcut entegrasyon lisansları AddDoconut() sırasında bir kez yükler ve şu önceliği kullanır:

text
LicenseStream > LicenseContent > LicensePath > automatic discovery

Otomatik keşif, Doconut.Viewer.lic ve eşlik eden Doconut.Viewer.<Capability>.lic dosyalarını arar. Önceki statik çağrılar Viewer.DoconutLicense(...) ve Viewer.SetLicensePlugin(...) mevcut bir başlangıç mekanizması değildir ve eski Viewer yapıcısının kabul ettiği lisans yolu List<string> de aynı şekilde değildir. Lisansı DoconutOptions'a taşıyın, otomatik keşif kullanırken eşlik eden dosyaları birlikte tutun, bir lisans değişikliğinden sonra yeniden başlatın ve yetenekleri IDoconutLicenseService aracılığıyla doğrulayın.

Eski bir eklenti lisansının varlığının, mevcut eklenti derlemesi için hak sağladığını varsaymayın. Viewer, Search, Annotation, Converter ve DICOM'u onaylanmış sürüm artefaktlarıyla ayrı ayrı test edin.

3. Başlangıç ve bağımlılık enjeksiyonu

Önceden viewer her istek için oluşturuluyordu ve seçenekler middleware'e aktarılıyordu:

csharp
// Önceki entegrasyon — sadece karşılaştırma; mevcut SDK'ye karşı derlemeyin.
var viewer = new Viewer(_cache, _accessor);
// …
appBranch.UseDoconut(new DoconutOptions { UnSafeMode = false, ShowDoconutInfo = false });

Mevcut entegrasyon Doconut'u bir kez kaydeder ve Viewer'ı bağımlılık enjeksiyonundan alır:

csharp
builder.Services.AddDoconut(options =>
{
    options.UnsafeMode      = false;   // not: yazım değişikliği: UnSafeMode → UnsafeMode
    options.ShowDoconutInfo = false;
    options.LicensePath     = "Doconut.Viewer.lic";
});
builder.Services.AddDistributedMemoryCache(); // oturum durumu bir önbellek gerektirir (MVC/Razor Pages zaten bir tane ekler)
builder.Services.AddSession();

app.UseSession();
app.UseDoconutResources();
app.UseDoconut();

Viewer geçici bir hizmettir. Belge oturum yöneticisi ve önbelleği daha uzun ömürlü belge durumunu sahiplenir, belirli enjekte edilen Viewer örneği değil.

Devam ettirilecek üç şey:

  • new Viewer(cache, accessor) artık yok. Doconut.Viewer'ı denetleyicinize enjekte edin veya bir Razor görünümünde @inject Doconut.Viewer Viewer kullanın.
  • UseDoconutResources() elle bağlama app.UseMiddleware<EmbeddedResourceMiddleware>() yerine geçer ve belge dalından önce çalıştırılmalıdır.
  • UnSafeMode → UnsafeMode. Derleyicinin yakalayacağı tek karakterlik bir yeniden adlandırma.

UnsafeMode false olduğunda SDK oturum belirtecini kaynak isteğe karşı doğrular, bu yüzden AddSession() / UseSession() hâlâ işlem hattında olmalı, UseSession() daldan önce.

Artık mevcut olmayan yöntemler

ÖnceŞimdi
viewer.OpenDocument(path, config, options)await viewer.OpenDocumentAsync(path, config, options)
viewer.InitCache()kaldırıldı — elle ısıtmak için bir şey yok; çağrıyı ve etrafındaki "did I already init?" bayrağını silin
viewer.ExportToPng(sharedPath)bkz. §7
viewer.ExportToCloud(cloudConfig)bkz. §7
using var v = new Viewer(...); v.CloseDocument(t)enjekte edilen örnek üzerinde viewer.CloseDocument(token)

4. Middleware ve kaynak yönlendirme

UseDoconut() artık argüman almaz. MapWhen dal şekli kendisi değişmek zorunda değil — sadece içindeki middleware değişir:

csharp
app.UseDoconutResources();   // DALLA ÖNCE

app.MapWhen(
    ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
    branch => branch.UseDoconut());

Mevcut işlem hattında:

  1. UseSession()'ı Doconut'tan önce, oturum güvenliği etkinken çağırın;
  2. UseDoconutResources()'ı UseDoconut()'dan önce çağırın;
  3. ResourcesPath, oluşturulan kaynak URL'lerini ve istemci ResPath'i uyumlu tutun;
  4. haritaladığınız dalı ve istemci BasePath'i uyumlu tutun.

MiddlewarePath doğrulanmış bir yapılandırmadır; tek başına bir ASP.NET Core dalı oluşturmaz.

5. Viewer oluşturulması ve ömrü

Uygulama sahipliğindeki Viewer nesnelerinin önbelleklerini kaldırın. Bir Viewer içinde tutmaya değer hiçbir şey kalmaz: belge durumu taşımaz ve oturum önbelleği bir isteğin ötesinde kalan her şeyi sahiplenir. Bunu bir uç noktaya, Razor sayfasına, denetleyiciye veya kapsamlı uygulama hizmetine enjekte edin:

csharp
app.MapPost("/api/open", async (Viewer viewer) =>
{
    var token = await viewer.OpenDocumentAsync("wwwroot/files/Sample.pdf");
    return Results.Ok(new { token });
});

Dönen token, sunucu tarafı bir belge oturumunu tanımlar. Bunu bir taşıyıcı kimlik bilgisi gibi davranın: kaydetmeyin, kalıcı hale getirmeyin veya analizlerde kullanmayın.

6. Belgeleri açma ve kapama

Senkrondaki OpenDocument(...) yerine OpenDocumentAsync(...) kullanın:

csharp
// Mevcut entegrasyon: Viewer DI'den geliyor ve belge açma işlemi asenkron.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { AllowSearch = true });

Mevcut aşırı yüklemeler bir dosya yolu veya akış, isteğe bağlı bir format yapılandırması, isteğe bağlı DocOptions ve bir iptal belirteci kabul eder. Tarayıcı artık ihtiyacı kalmadığında sunucu oturumunu açıkça kapatın:

csharp
viewer.CloseDocument(token);

InitCache() çağrısını ve onu koruyan bayrağı silin — elle ısıtılacak bir şey yok. Geçiş sonrası önceki kütüphane tarafından oluşturulan bir token'ı yeniden kullanmayın: her belgeyi mevcut API üzerinden tekrar açın.

7. Web farm → dağıtık: en büyük değişiklik

UseDoconutWebFarm ve WebFarmOptions artık mevcut değil. Uygulamanız bunları çağırıyorsa, bu bölüm yükseltmeniz içindir; çağırmıyorsa, §8'e atlayın.

Daha önce tek bir ara katman her şeyi yapıyordu: paylaşılan bir klasörden önceden render edilmiş görüntüleri sunuyordu ve başka bir düğüm hâlâ bunları yazarken sorguluyordu.

csharp
// Önceki entegrasyon — tek çağrı, dosya sistemi üzerinden örtük koordinasyon.
appBranch.UseDoconutWebFarm(new WebFarmOptions
{
    Path                = Path.Combine(env.WebRootPath, "webfarm"),
    PageWaitTimeSeconds = 180,
    StartWaitFromPage   = 5,
});

Aynı görev şimdi iki açık bölüme ayrıldı. Yazma tarafı — belgeyi açan düğüm, tüm artefakt setini (sayfalar, belge bilgisi, arama indeksi, meta veriler) paylaşıma yayınlar:

csharp
var result = await _publisher.PublishAsync(          // DistributedDocumentPublisher, DI'den enjekte edilmiş
    pathToFile,
    new FileShareConfig
    {
        Location              = CloudLocation.FileShare,
        RootPath              = @"\\fileserver\doconut",   // bugün kullandığınız aynı klasör
        UsePerTokenSubfolders = true,
    },
    config,
    documentOptions,
    new DistributedDocumentPublishOptions
    {
        CleanUpStagingDirectory = true,
        FirstPagePriority       = true,
    });

return Content(result.Token);

Okuma tarafı — herhangi bir düğüm paylaşımdan hizmet verir:

csharp
app.MapWhen(
    ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
    branch => branch.UseDoconutCloud<FileShareCloudHandler>(options =>
    {
        options.Location          = CloudLocation.FileShare;
        options.CloudUploadConfig = /* aynı FileShareConfig yukarıdaki gibi */;
    }, "/"));
BeforeNow
WebFarmOptions.PathFileShareConfig.RootPath
PageWaitTimeSeconds / StartWaitFromPagegitti — yazma tarafında FirstPagePriority ve okuma tarafında FileShareConfig.ReadReadyPollMs ile değiştirildi
viewer.OpenDocument(...) then viewer.ExportToPng(share)tek PublishAsync(...) çağrısı
DocOptions.IsWebfarm / WebfarmPathhala mevcut, IsWebFarm / WebFarmPath olarak yazılıyor — ancak yayın yolunda gerekli değil

Topolojiniz değişmez. RootPath'i aynı UNC paylaşımına yönlendirin ve her düğüm bugün olduğu gibi çalışmaya devam eder. Değişen şey, yayınlamanın render işleminin yan etkisi yerine çağırdığınız bir işlem olmasıdır.

Her iki yarı da aynı fikirde olmalıdır. RootPath veya UsePerTokenSubfolders yayıncı ile işleyici arasında farklıysa, diğer düğüm 404 yanıt verir. Yapılandırmayı tek bir yardımcıda oluşturun ve her iki taraftan da çağırın.

PageWaitTimeSeconds = 180 "sayfanın görünmesini bekleyerek üç dakikaya kadar blokla" anlamına geliyordu. Yerine geçen açık bir yaklaşımdır: FirstPagePriority = true ile sayfa 1 hemen hizmet verilebilir ve sonraki sayfalar HTTP 202 Accepted yanıtını yazarılana kadar verir. Paketlenmiş görüntüleyici, retryOn409 ayarlandığında otomatik olarak yeniden dener. Yeniden denemeyen bir istemci, hâlâ render edilen sayfalar için kırık döşemeler gösterir.

Tam düzenleme, arka plan yayınlaması ve erişim biletleri dahil, Dağıtık Dağıtımlar sayfasında bulunur.

8. Dönüştürme bir eklentidir ve çok daha küçüktür

Eklentiyi kaydedin, ardından DocumentConverter fasadını enjekte edin:

csharp
builder.Services.AddDoconut(o => o.AddPlugin<ConverterPlugin>());
csharp
// Önceki entegrasyon
var converter = viewer.Converter.GetConverter();
var config    = new WordConfigConverter { TargetFormat = WordConfigConverter.EnTargetFormat.PDF };
var result    = converter.Convert(stream, SourceFormatConverter.DOCX, config);

// Güncel entegrasyon
var result = await _converter.ConvertAsync(stream, ".docx", ConversionTarget.Pdf, null, ct);

Bunun yerine geçenler:

  • SourceFormatConverter — kaldırıldı. Dosya uzantısını nokta dahil bir string olarak geçirin.
  • Aile başına *ConfigConverter tipleri (WordConfigConverter, ExcelConfigConverter, …), her biri iç içe EnTargetFormat enum'ı ile — kaldırıldı. Artık her aile için tek bir ConversionTarget enum'u var.
  • viewer.Converter.GetConverter() — kaldırıldı. Doconut.DocumentConverter'ı enjekte edin.

ConvertAsync bir aranabilir akış döndürür, bu yüzden return File(result, mime, name) doğrudan çalışır — eski kodun ihtiyaç duyduğu MemoryStream kopyası gereksizdir. Dağıtılan örnekte bu, 68 durumlu uzantı anahtarını ve on tane neredeyse aynı denetleyiciyi sildi.

Tam özellikler için Dönüştürücü Eklentisi bölümüne bakın.

9. Bulut sağlayıcıları

UseDoconutCloud jenerik hâle geldi. Sağlayıcı, ara katmanda Location değerine göre seçilen bir tip argümanı olur:

csharp
// Önceki entegrasyon
appBranch.UseDoconutCloud(new CloudOptions { Location = CloudLocation.CDN, ... });

// Güncel entegrasyon
branch.UseDoconutCloud<CDNCloudHandler>(options =>
{
    options.Location          = CloudLocation.CDN;
    options.CloudUploadConfig = new CDNConfig { DoconutCdnUrl = "..." };
}, "/");

Yapılandırma sınıfları, ad alanı (Doconut.Configs.Cloud → Doconut.Clouds) dışındaki tüm yönleriyle değişmemiştir: AzureConfig, AmazonConfig, GoogleCloudConfig, DropBoxConfig, RedisConfig, CDNConfig, FTPConfig ve yeni FileShareConfig. İşleyiciler <Provider>CloudHandler şeklinde adlandırılır.

CDN işleyicisi salt okunurdır — CDN'de zaten bulunanı sunar; yükleme yapmaz.

10. İsimleri değişen yapılandırma nesneleri

ÖnceŞimdi
DoconutOptions.UnSafeModeUnsafeMode
DocOptions.IsWebfarmIsWebFarm
DocOptions.WebfarmPathWebFarmPath
DocOptions.ImageResolutionhâlâ mevcut ancak eski — çözünürlüğü doğrudan format yapılandırmasında ayarlayın

DocOptions ayrıca IsSecured özelliğini kazanır.

Mevcut API, önceki sürümden daha katı bir sorumluluk ayrımı yapar; bu yüzden her ayarın artık ait olduğu nesnede olduğundan emin olun:

EndişeMevcut tip
Ara katman yolları, lisanslama, eklenti kaydıDoconutOptions
Şifre, zaman aşımı, güvenlik, filigranDocOptions
Format render'ı ve DPIPdfConfig, WordConfig, ExcelConfig ve diğer BaseConfig tipleri
Tarayıcı widget varsayılanlarıViewerConfig veya eşdeğer JavaScript seçenekleri
Oluşturulan CSS ve betiklerCssConfig ve ScriptConfig
Paylaşılan depolama ve bulut sağlayıcılarıFileShareConfig ve diğer Doconut.Clouds yapılandırmaları

DocOptions.ImageResolution'ı render kontrolü olarak taşımayın. Bu özellik eski; format‑spesifik yapılandırmada BaseConfig.ImageResolution'ı ayarlayın. Önceki bir yapılandırmanın aynı davranışı gösterdiğini varsaymak yerine tüm varsayılanları gözden geçirin.

11. İstemci‑tarafı görüntüleyici — sessizce başarısız olan iki değişiklik

Bu iki değişiklik de sunucunun sorunsuz çalışmasını sağlar. Belgeniz render olur, sayfa doğru görünür ve tarayıcı konsolunda hiçbir şey görünmez. C# kodunuz ilk denemede derlense bile bu bölümü okuyun.

Görüntüleyici geri çağrıları artık seçenek, global fonksiyon değil

Önceki görüntüleyici, işleyicilerinizi adlarıyla çağırır, global fonksiyon adını konteyner kimliğinden türetirdi. <div id="div_ctlDoc"> içeren bir sayfada function ctlDoc_OnViewerReady() tanımlamak yeterliydi. Güncel görüntüleyici, seçenek nesnesinde açık geri çağrılar alır ve artık bu global fonksiyonları aramaz:

javascript
objctlDoc = $("#div_ctlDoc").docViewer({
    // ... mevcut seçenekleriniz ...
    onViewerBusy:     ctlDoc_OnViewerBusy,      // isimle bulunuyordu
    onViewerReady:    ctlDoc_OnViewerReady,     // isimle bulunuyordu
    onCopy:           ctlDoc_Copy,              // ctlDoc_Copy(text) idi
    onAutoLoadStatus: ctlDoc_AutoLoadStatus     // ctlDoc_AutoLoadStatus(page) idi
});

Neden sorunlu: eski çağrı boş bir catch içinde sarılmıştı, bu da her şeyi yutuyordu. Şimdi fonksiyonlarınız hiç çalışmaz ve hiçbir hata raporlanmaz. Yaygın belirti, hiç durmayan bir bekleme döndürmesidir — çünkü onu gizleyen fonksiyon ctlDoc_OnViewerReady idi. Belge ise sorunsuzdur.

Tam seçenek listesi onPageLoading, onPageLoaded, onThumbnailClicked, onPageClicked, onDoubleClick, onViewerBusy, onViewerReady, onViewerError, onCopy, onAnnSaved, onAnnSaveError, onAnnLoaded, onAnnClosed, onAutoLoadStatus, onThumbsShown ve onError'dır. Bağlantı‑tıklama geri çağrısı yoktur: hiperlink işleme dahildir ve showHyperlinks tarafından yönlendirilir.

ResPath kaynak önekine işaret etmeli

javascript
ResPath: '',                      // ÖNCE — kaynaklar uygulama kökünden geliyordu
ResPath: 'doconut-res/images',    // ŞİMDİ — UseDoconutResources() tarafından monte edilen önek

Eğer önek'i DoconutOptions.ResourcesPath ile değiştirdiyseniz, bunun yerine o değeri kullanın.

12. Viewer araç çubuğu, Arama ve Açıklama

Eski betikleri tek tek taşımayın. Mevcut referans uygulamaları tek bir tam sayfa paketi oluşturur:

  1. ReferenceCss ile Viewer CSS ve lisanslı Arama/Açıklama CSS'sini yayınlayın;
  2. uygulamaya ait Viewer araç çubuğunu render edin;
  3. searchBarMount, annBarMount ve gerekli Viewer mount'ını render edin;
  4. ReferenceScripts ile Viewer ve lisanslı modül betiklerini yayınlayın;
  5. uygulamanın kendi araç çubuğu yardımcı betiğini yükleyin;
  6. bir objViewer başlatın;
  7. lisanslı Arama ve Açıklama Şeritlerini başlatın;
  8. her Şeritte attach(objViewer) çağırın;
  9. belgeyi açın ve objViewer.View(token) çağırın.

Arama ve Açıklama, aynı Viewer'a eklenen modüllerdir, bağımsız araç çubukları değildir. Ana araç çubuğu host uygulamaya aittir; Arama ve Açıklama Şeritleri gömülü, yetenek‑kapılı kaynaklardır.

documentLinks.js ve docViewer.UI.js gibi manuel kopyalanmış dosyaları yalnızca mevcut sayfa ReferenceCss ve ReferenceScripts tarafından yayınlanan kaynaklarla çalıştıktan sonra kaldırın.

13. Eklenti kaydı

Statik eklenti‑lisans yöntemleri mevcut eklentileri kaydetmez. Her yayınlanan paketi açıkça kurun ve kaydedin:

csharp
builder.Services.AddDoconut(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

AddDoconut() başlangıçta kayıtlı eklenti yeteneklerini doğrular. Converter ve DICOM, yayınlanan .NET Standard eklentileridir. Normal Arama ve Açıklama, AddPlugin<TPlugin>() paketleri olmayan, yerleşik lisanslı özelliklerdir.

14. Oturum ve belge güvenliği

Mevcut entegrasyon belgeleri opak token'lar ve önbelleğe alınmış oturumlarla bağlar. Varsayılan UnsafeMode = false ile UseDoconut() belge‑erişim güvenliği ekler ve host'un ASP.NET oturumunu yapılandırması gerekir:

csharp
builder.Services.AddDistributedMemoryCache(); // oturum durumu bir önbelleğe ihtiyaç duyar (MVC/Razor Pages zaten bir tane ekler)
builder.Services.AddSession();
app.UseSession();

DocOptions.IsSecured = true tutun, aksi tasarım gözden geçirilmedikçe. Tek bir düğümde geçiş kısayolu olarak UnsafeMode = true asla kullanmayın. Token olmadan, hatalı bir token, süresi dolmuş bir token ve farklı bir tarayıcı oturumundan gelen bir token ile istekleri test edin.

Bir çiftlikte sayfa isteği, açılış isteğini hiç görmemiş bir düğüme gelebilir; bu durumda oturum‑başına kontrol isteği reddeder. UnsafeMode = true'ın doğru olduğu tek durum budur — ve bu, AddDoconutDistributedDocumentSecurity aracılığıyla imzalı erişim biletleriyle eşleştirilmelidir, tek başına dağıtılmamalıdır. Bakınız Dağıtılmış Dağıtımlar.

İsimlendirme notu

Tüm çerçevelerde sınıf Viewer'dır. Eski kod parçacıklarında veya üçüncü‑taraf makalelerde DocumentViewer görürseniz, bu tip SDK'da hiç bulunmamıştır.

15. Önerilen çalışma sırası

  1. Host çerçevesinin netstandard2.1'i tüketebileceğini doğrulayın. Yapamıyorsa, durun.
  2. Paketi 26.8.0'a yükseltin ve derleyin. Derleme hatalarını giderin — çoğu §1'deki using satırlarından kaynaklanır.
  3. Başlangıcı AddDoconut()'a taşıyın ve ara katman çağrılarını yeni sıralarına göre düzenleyin (§3, §4).
  4. Viewer'ı oluşturduğunuz yere enjekte edin, OpenDocument'i async yapın ve InitCache()'i silin (§5, §6).
  5. Web çiftliğini kullanıyorsanız §7'yi uygulayın — yeniden adlandırma değil, yeniden tasarım olan tek kısımdır.
  6. Belgeleri dönüştürüyorsanız §8'i uygulayın.
  7. §11'i yapın — istemci‑tarafı değişiklikler. Bunlar kendilerini duyurmayacak olanlardır.
  8. Gerçek bir belgeyi tarayıcıda açın ve meşgul döndürme simgesini izleyin. Yeşil bir derleme burada bir şey kanıtlamaz: lisanslama, eklenti kaydı, kaynak yolu ve viewer geri çağrıları yalnızca çalışma zamanında başarısız olur. Bir çiftlikte, bir düğüm tarafından yayınlanan bir belgenin başka bir düğüm tarafından servis edildiğini doğrulayın.

Göçü Test Etme

En azından, şunları doğrulayın:

  • üretim lisansı ve tüm kayıtlı eklentilerle uygulama başlatma;
  • Viewer CSS/skriptleri ve seçilen yollar altındaki tüm sayfa‑görüntü istekleri;
  • belge açma, gezinme, yakınlaştırma, küçük resimler, yazdırma ve açıkça kapatma;
  • metin içeren bir belgede arama ve yalnızca görüntü dosyasının aranamaz durumu;
  • açıklama yükleme, kaydetme, dışa aktarma ve yetenek kısıtlaması;
  • dönüştürücü hedef keşfi, çıktı, indirme ve filigran durumu;
  • DICOM sayfaları, çerçeveler ve animasyon; teknik meta veriler bu pakette mevcut değil;
  • şifre korumalı belgeler, özel yazı tipleri, Latin dışı metin ve yapılandırılmış zaman aşımı süreleri;
  • oturumlar arası token reddi ve süresi dolmuş oturum davranışı;
  • bir çiftlik için: bir düğümde yayınlayın, diğerinden geç bir sayfa isteyin ve viewer'ın kırık döşemeler yerine 202 yanıtlarını yeniden denediğini doğrulayın;
  • mobil, karanlık mod ve üretim ters‑proxy yolu.

Geri Dönüş Planı

Önceki dağıtım artefaktını, eşleşen paketleri, lisans dosyalarını ve kopyalanmış tarayıcı kaynaklarını bir arada tutun. Güvenli bir geri dönüş, tüm uygulama neslini değiştirir; önceki nesil sunucuyu mevcut skriptlerle veya mevcut sunucuyu new Viewer(...) çağrı noktalarıyla karıştırmaz.

Kesinti öncesinde, belgeleyin:

  • geri dönüş için kullanılan dağıtım slotu veya artefakt;
  • ortak depolama etkisi, varsa — 26.8.0 tarafından yayınlanan artefaktlar önceki web‑çiftlik ara katmanı tarafından tüketilmez;
  • aktif belge oturumlarının nasıl geçersiz kılınacağı;
  • geri dönüş kararını vermek için kullanılan sağlık kontrolü ve duman belgesi;
  • önceki paket setini ve yapılandırmayı kim geri yükleyebilir.

Eski Belgeler

Çevrilmiş önceki kılavuz şu adreste mevcuttur
Eski .NET Standard kurulumu.
Önceki entegrasyon geçidi aynı tanımlama sinyallerini açıklar ve bu göç rehberine geri bağlanır.

Netstandard2.0 kurulumları hâlâ mevcutken tarihsel URL'yi yer imlerinde ve destek biletlerinde tutun. Bu, farklı bir nesli belgelemektedir ve mevcut API'ye yönlendirilmez.

Bu sayfa yardımcı oldu mu?