.NET Standard 2.1'e Geçiş

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

Doconut iki ayrı .NET Standard entegrasyonuna sahiptir. Aynı Doconut.NETStandard paket adını kullanırlar, bu yüzden paketleri, başlangıcı, lisansları veya tarayıcı kaynaklarını değiştirmeden önce sürümden ve uygulamadaki API'lerden 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 üzerinetstandard2.1güncel API

Sürüm numarasını artırmak yükseltmedir. Yüklemek için ayrı bir paket yok ve uyumluluk köprüsü de yok — 26.8.0 farklı bir API yüzeyidir. 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(...) (senkron)Ö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(...)Güncel
app.UseDoconutResources() ve app.UseDoconut() argümansızGüncel
Viewer bağımlılık enjeksiyonu ile sağlanırGüncel
await viewer.OpenDocumentAsync(...)Güncel

Eğer her iki sütun aynı uygulamada bulunuyorsa, geçişi eksik olarak değerlendirin. Bir belge token'ını diğer nesilden gelen kaynaklar veya ara katman üzerinden göndermeyin.

Öncelikle ana çerçeveyi kontrol edin

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

Host26.8.0'i tüketebilir
.NET Core 3.0 veya ü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 her iki referans uygulaması da net8.0 hedefler.

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 bir 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, görüntüleyici 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ışına koruyun.
  5. PDF, Office, görüntü, CAD, e-posta, DICOM, aranabilir, şifre korumalı ve açıklamalı belgelerden temsili 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â mevcut. Ç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 yerineği yok. Uygulamanız bu tiplere referans veriyorsa, o bölümü ayrı planlayın ve bu geçişin bir parçası olarak değerlendirmeyin.

2. Paket ve lisans uyumluluğu

Çekirdek 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 iletin:

bash
dotnet add package Doconut.NETStandard --version 26.8.0

Her Doconut eklentisini çekirdek paketle aynı sürümde tutun — Doconut.NETStandard.Converter ve Doconut.NETStandard.Dicom. Mevcut bütünleşme, lisansları AddDoconut() sırasında bir kez yükler, bu önceliği kullanarak:

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 yollarının List<string> da değildir. Lisansı DoconutOptions konumuna taşıyın, otomatik keşif kullanırken eşlik eden dosyaları birlikte tutun, bir lisansı değiştirdikten 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ı varsamayın. Viewer, Search, Annotation, Converter ve DICOM'u onaylanmış sürüm artefaktlarıyla ayrı ayrı test edin.

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

Daha önce görüntüleyici her istek için oluşturuluyordu ve seçenekler ara katmana iletiliyordu:

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

Mevcut bütünleşme Doconut'u bir kez kaydeder ve bağımlılık enjeksiyonundan Viewer alır:

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

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

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

Devam ettirilecek üç şey:

  • new Viewer(cache, accessor) artık yok. Doconut.Viewer'ı denetleyicinize enjekte edin veya Razor görünümünde @inject Doconut.Viewer Viewer kullanın.
  • UseDoconutResources(), elle bağlamayı app.UseMiddleware<EmbeddedResourceMiddleware>() ile değiştirir ve belge dalından önce çalıştırılmalıdır.
  • UnSafeMode → UnsafeMode. Tek karakterlik bir yeniden adlandırma derleyici tarafından yakalanır.

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

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ıtılacak 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)viewer.CloseDocument(token) enjekte edilmiş örnek üzerinde

4. Ara katman ve kaynak yönlendirme

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

csharp
app.UseDoconutResources();   // BRANCH'tan önce

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

Mevcut işlem hattında:

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

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

5. Görüntüleyici oluşturma ve ömrü

Uygulama tarafından sahip olunan Viewer nesnelerinin önbelleklerini kaldırın. Bir Viewer içinde artık hiçbir şey kalmaz, tutmaya değer bir şey yoktur: belge durumu taşımaz ve oturum önbelleği her şeyi sahiplenir. isteğin ötesine geçen her şey. Bunu bir uç noktaya, Razor sayfasına, denetleyiciye veya kapsamlı bir 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ı belge oturumunu tanımlar. Bunu bir taşıyıcı kimlik bilgisi olarak ele alın: kaydetmeyin, kalıcı hale getirmeyin ve analizlerde kullanmayın.

6. Belge açma ve kapama

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

csharp
// Mevcut entegrasyon: Viewer DI'den geliyor ve belge açma asenkron olarak gerçekleşiyor.
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 token'ı kabul eder. Sunucu oturumunu, tarayıcı artık buna ihtiyaç duymadığında açıkça kapatın:

csharp
viewer.CloseDocument(token);

Herhangi bir InitCache() çağrısını ve onu koruyan bayrağı silin — elle ısıtacak bir şey yoktur. Kesim sonrası önceki kütüphane tarafından oluşturulan bir token'ı yeniden kullanmayın: her belgeyi geçerli API üzerinden tekrar açın.

7. Web çiftliği → 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ükseltmenizi sağlar; çağırmıyorsa, §8'e atlayın.

Daha önce tek bir ara katman her şeyi yapıyordu: paylaşılan bir klasörden önceden oluşturulmuş görüntüleri sunuyordu klasör ve sorguluyordu diğer bir düğüm hâlâ onları yazarken.

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ı iş şimdi iki açık yarıya bölünmüş durumda. 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 = /* yukarıdaki SAME FileShareConfig */;
    }, "/"));
ÖnceŞimdi
WebFarmOptions.PathFileShareConfig.RootPath
PageWaitTimeSeconds / StartWaitFromPagegitti — yazma tarafında FirstPagePriority ile ve okuma tarafında FileShareConfig.ReadReadyPollMs ile değiştirildi
viewer.OpenDocument(...) sonra viewer.ExportToPng(share)bir PublishAsync(...) çağrısı
DocOptions.IsWebfarm / WebfarmPathhâla mevcut, IsWebFarm / WebFarmPath olarak yazılır — ancak yayın yolunda gerekli değil

Topolojiniz değişmez. RootPath'ı 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 bir yan etki yerine siz tarafından çağrılan bir işlem olmasıdır.

Her iki yarı da aynı fikirde olmalı. Yayıncı ile işleyici arasında RootPath veya UsePerTokenSubfolders 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 engellemek anlamına geliyordu. Değişiklik açıktır: FirstPagePriority = true ile, sayfa 1 hemen sunulabilir ve sonraki sayfalar HTTP 202 Accepted yanıtını yazarak verilir. Paketlenmiş görüntüleyici, retryOn409 ayarlandığında otomatik olarak yeniden dener. Yeniden denemeyen bir istemci, hâlâ işlenen sayfalar için bozuk döşemeler gösterir.

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

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

Eklentiyi kaydedin, ardından DocumentConverter yüzeyini 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);

// Mevcut 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 dize olarak geçirin.
  • Aile başına *ConfigConverter türleri (WordConfigConverter, ExcelConfigConverter, …), her biri iç içe bir EnTargetFormat enum ile — kaldırıldı. Artık her aile için bir ConversionTarget enum var.
  • viewer.Converter.GetConverter() — kaldırıldı. Doconut.DocumentConverter enjekte edin.

ConvertAsync, aranabilir bir akış döndürür, böylece return File(result, mime, name) doğrudan çalışır — eski kodun MemoryStream kopyasına ihtiyaç artık yoktur. Dağıtılan örnek, 68 durumlu bir uzantı anahtarını ve on neredeyse aynı denetleyiciyi sildi.

Tam özellik listesi için Converter Plugin sayfasına bakın.

9. Bulut sağlayıcıları

UseDoconutCloud artık genel bir hâle geldi. Sağlayıcı, ara katmanda içinde değiştirilen bir Location değerinden ziyade tip argümanıdır:

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

// Mevcut 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 kısmı değişmemiştir: AzureConfig, AmazonConfig, GoogleCloudConfig, DropBoxConfig, RedisConfig, CDNConfig, FTPConfig, ayrıca yeni FileShareConfig. İşleyiciler <Provider>CloudHandler olarak adlandırılır.

CDN işleyicisi yalnızca okunabilir — CDN'de zaten bulunanı sunar; yükleme yapmaz.

10. Adı değiştirilen yapılandırma nesneleri

ÖnceŞimdi
DoconutOptions.UnSafeModeUnsafeMode
DocOptions.IsWebfarmIsWebFarm
DocOptions.WebfarmPathWebFarmPath
DocOptions.ImageResolutionhâlâ mevcut ancak kullanımdan kaldırılmış — çözünürlüğü format yapılandırmasında ayarlayın

DocOptions ayrıca IsSecured kazanır.

Mevcut API, öncekinden daha katı bir şekilde sorumlulukları ayırır, bu yüzden her ayarın artık sahip olduğu nesnede olduğundan emin olun:

KonuMevcut tip
Ara katman yolları, lisanslama, eklenti kaydıDoconutOptions
Şifre, zaman aşımı, güvenlik, filigranDocOptions
Format renderleme ve DPIPdfConfig, WordConfig, ExcelConfig, ve diğer BaseConfig türleri
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'yi render kontrolü olarak ileriye taşımayın. Bu artık kullanımdan kaldırılmış; format‑özel yapılandırmada BaseConfig.ImageResolution'yi 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

Her ikisi de sunucunun sorunsuz çalışmasını sağlar. Belgeniz renderlanır, 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 isimleriyle çağırır, global fonksiyon adını konteyner kimliğinden türetirdi. Bir sayfada function ctlDoc_OnViewerReady()'yi <div id="div_ctlDoc"> ile bildirmek yeterliydi. Mevcut görüntüleyici, seçenekler 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,      // adıyla bulundu
    onViewerReady:    ctlDoc_OnViewerReady,     // adıyla bulundu
    onCopy:           ctlDoc_Copy,              // ctlDoc_Copy(text) idi
    onAutoLoadStatus: ctlDoc_AutoLoadStatus     // ctlDoc_AutoLoadStatus(page) idi
});

Neden bu sorunlu: eski çağrı, her şeyi yutan boş bir catch içinde sarılmıştı. Şimdi fonksiyonlarınız hiç çalışmaz ve hiçbir hata raporlanmaz. Yaygın belirti, asla durmayan bir dönen yük göstergesidir — çünkü onu gizleyen fonksiyon ctlDoc_OnViewerReady idi. Arkasındaki belge ise düzgündür.

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

ResPath kaynak önekine işaret etmelidir

javascript
ResPath: '',                      // ÖNCE — kaynaklar uygulama kökünden geliyordu
ResPath: 'doconut-res/images',    // ŞİMDİ    — UseDoconutResources() öneki bağlar

Eğer öneki DoconutOptions.ResourcesPath aracılığıyla değiştirdiyseniz, bunun yerine o değeri kullanın.

12. Görüntüleyici 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. Viewer CSS ve lisanslı Arama/Açıklama CSS'lerini ReferenceCss ile yayınlayın;
  2. Uygulama sahipliğindeki Viewer araç çubuğunu render edin;
  3. searchBarMount, annBarMount ve gerekli Viewer bağlamasını render edin;
  4. Viewer ve lisanslı modül betiklerini ReferenceScripts ile 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 Şerit üzerinde attach(objViewer) çağırın;
  9. Belgeyi açın ve objViewer.View(token) çağırın.

Arama ve Açıklama, aynı Viewer'a eklenmiş modüllerdir, bağımsız araç çubukları değildir. Ana araç çubuğu ana uygulamaya aittir; Arama ve Açıklama Şeritleri gömülü, yetenek‑kısıtlamalı 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, yerleşik lisanslı özelliklerdir, AddPlugin<TPlugin>() paketleri değildir.

14. Oturum ve belge güvenliği

Mevcut entegrasyon, belgeleri opak token'lara ve önbelleğe alınmış oturumlara bağlar. Varsayılan UnsafeMode = false ile, UseDoconut() belge erişim güvenliğini ekler ve ana uygulama ASP.NET oturumunu yapılandırmalıdır:

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'yi, gözden geçirilmiş bir tasarım aksi gerektirmedikçe tutun. Tek bir düğümde geçiş kısayolu olarak UnsafeMode = true'yi asla kullanmayın. Token olmayan, hatalı biçimlendirilmiş, süresi dolmuş ve farklı bir tarayıcı oturumundan gelen token içeren istekleri test edin.

Bir farmda sayfa isteği, açılış isteğini hiç görmemiş bir düğüme gelebilir, bu yüzden oturum başına kontrol onu reddeder. Bu, UnsafeMode = true'nin doğru olduğu tek durumdur — ve tek başına gönderilmemeli, AddDoconutDistributedDocumentSecurity aracılığıyla imzalı erişim biletleriyle eşleştirilmelidir. Bakınız Dağıtılmış Dağıtımlar.

İsimlendirme notu

Tüm çerçevelerde sınıf Viewer'dir. Eski kod parçacıklarında veya üçüncü taraf makalelerde DocumentViewer bulursanız, bu tür SDK'da hiç var olmamıştır.

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

  1. Ana çerçevenin netstandard2.1'i tüketebileceğini doğrulayın. Eğer tüketemiyorsa, durun.
  2. Paketi 26.8.0'a yükseltin ve derleyin. Derleme hatalarını giderin — çoğu §1'deki using satırlarıdır.
  3. Başlangıcı AddDoconut()'ye taşıyın ve ara katman çağrılarını yeni sıralarına (§3, §4) yerleştirin.
  4. Viewer'yi oluşturduğunuz yere enjekte edin, OpenDocument'yi async yapın ve InitCache()'yi silin (§5, §6).
  5. Web farmını kullanıyorsanız, §7'yi yapın — yeniden adlandırma yerine tek yeniden tasarım kısmı.
  6. Belgeleri dönüştürüyorsanız, §8'i yapın.
  7. §11'i yapın — istemci tarafı değişiklikler. Bunlar kendilerini duyurmayacak olanlardır.
  8. Bir tarayıcıda gerçek bir belge açın ve meşgul dönen göstergesine bakın. Yeşil bir derleme burada hiçbir şey kanıtlamaz: lisanslama, eklenti kaydı, kaynak yolu ve görüntüleyici geri aramaları yalnızca çalışma zamanında başarısız olur. Bir farm için, bir düğüm tarafından yayınlanan belgenin başka bir düğüm tarafından sunulduğunu doğrulayın.

Göçü Test Etme

En azından, doğrulayın:

  • üretim lisansı ve tüm kayıtlı eklentilerle uygulama başlatma;
  • Seçilen yollar altında Viewer CSS/skriptleri ve 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 izleyicinin kırık döşemeler yerine 202 yanıtlarını yeniden denediğini onaylayı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ı birlikte 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.

Geçişten önce, belgeleyin:

  • geri dönüş için kullanılan dağıtım yuvası 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;
  • kimlerin önceki paket setini ve yapılandırmayı geri yükleyebileceği.

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.

Geçmiş URL'yi yer imlerinde ve destek biletlerinde tutun, netstandard2.0 kurulumları hâlâ mevcut olduğu sürece. Farklı bir nesli belgeleyen bu, mevcut API'ye yönlendirilmez.

Bu sayfa yardımcı oldu mu?