.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üm | Hedef | API |
|---|---|---|
| 26.7.0 ve altı | netstandard2.0 | önceki API |
| 26.8.0 ve üstü | netstandard2.1 | mevcut 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ız | Mevcut |
| Bağımlılık enjeksiyonu ile sağlanan Viewer | Mevcut |
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:
| Host | 26.8.0'ı tüketebilir mi |
|---|---|
| .NET Core 3.0 ve üzeri ( .NET 5/6/7/8 dahil ) | Evet |
| .NET Framework, herhangi bir sürüm | Hayı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
- Mevcut uygulamanın bir dalını ve dağıtılabilir bir yedeğini oluşturun.
- Tam çekirdek ve eklenti paket sürümlerini kaydedin.
- Her
new Viewer(...)çağrısını,InitCache()çağrısını, lisans yükleme çağrısını,UseDoconutWebFarmeş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. - Mevcut
.licdosyalarını ve dağıtım gizli anahtarlarını kaynak kontrolünün dışında koruyun. - PDF, Office, görüntü, CAD, e‑posta, DICOM, aranabilir, şifre korumalı ve açıklamalı belgelerden temsilci bir set yakalayın.
- 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:
dotnet add package Doconut.NETStandardBu kılavuz tarafından denetlenen sürüme tekrarlanabilir bir geçiş için, sürümü ayrı bir seçenek olarak geçirin:
dotnet add package Doconut.NETStandard --version 26.8.0Her 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:
LicenseStream > LicenseContent > LicensePath > automatic discoveryOtomatik 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:
// Ö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:
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 Viewerkullanın.UseDoconutResources()elle bağlamaapp.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:
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:
UseSession()'ı Doconut'tan önce, oturum güvenliği etkinken çağırın;UseDoconutResources()'ıUseDoconut()'dan önce çağırın;ResourcesPath, oluşturulan kaynak URL'lerini ve istemciResPath'i uyumlu tutun;- 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:
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:
// 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:
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.
// Ö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:
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:
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 */;
}, "/"));| Before | Now |
|---|---|
WebFarmOptions.Path | FileShareConfig.RootPath |
PageWaitTimeSeconds / StartWaitFromPage | gitti — 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 / WebfarmPath | hala 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.
RootPathveyaUsePerTokenSubfoldersyayı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:
builder.Services.AddDoconut(o => o.AddPlugin<ConverterPlugin>());// Ö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
*ConfigConvertertipleri (WordConfigConverter,ExcelConfigConverter, …), her biri iç içeEnTargetFormatenum'ı ile — kaldırıldı. Artık her aile için tek birConversionTargetenum'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:
// Ö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.UnSafeMode | UnsafeMode |
DocOptions.IsWebfarm | IsWebFarm |
DocOptions.WebfarmPath | WebFarmPath |
DocOptions.ImageResolution | hâ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şe | Mevcut tip |
|---|---|
| Ara katman yolları, lisanslama, eklenti kaydı | DoconutOptions |
| Şifre, zaman aşımı, güvenlik, filigran | DocOptions |
| Format render'ı ve DPI | PdfConfig, WordConfig, ExcelConfig ve diğer BaseConfig tipleri |
| Tarayıcı widget varsayılanları | ViewerConfig veya eşdeğer JavaScript seçenekleri |
| Oluşturulan CSS ve betikler | CssConfig 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:
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
ResPath: '', // ÖNCE — kaynaklar uygulama kökünden geliyordu
ResPath: 'doconut-res/images', // ŞİMDİ — UseDoconutResources() tarafından monte edilen önekEğ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:
ReferenceCssile Viewer CSS ve lisanslı Arama/Açıklama CSS'sini yayınlayın;- uygulamaya ait Viewer araç çubuğunu render edin;
searchBarMount,annBarMountve gerekli Viewer mount'ını render edin;ReferenceScriptsile Viewer ve lisanslı modül betiklerini yayınlayın;- uygulamanın kendi araç çubuğu yardımcı betiğini yükleyin;
- bir
objViewerbaşlatın; - lisanslı Arama ve Açıklama Şeritlerini başlatın;
- her Şeritte
attach(objViewer)çağırın; - 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:
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:
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ı
- Host çerçevesinin netstandard2.1'i tüketebileceğini doğrulayın. Yapamıyorsa, durun.
- Paketi 26.8.0'a yükseltin ve derleyin. Derleme hatalarını giderin — çoğu §1'deki
usingsatırlarından kaynaklanır. - 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). Viewer'ı oluşturduğunuz yere enjekte edin,OpenDocument'i async yapın veInitCache()'i silin (§5, §6).- Web çiftliğini kullanıyorsanız §7'yi uygulayın — yeniden adlandırma değil, yeniden tasarım olan tek kısımdır.
- Belgeleri dönüştürüyorsanız §8'i uygulayın.
- §11'i yapın — istemci‑tarafı değişiklikler. Bunlar kendilerini duyurmayacak olanlardır.
- 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
202yanı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?