.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üm | Hedef | API |
|---|---|---|
| 26.7.0 ve altı | netstandard2.0 | önceki API |
| 26.8.0 ve üzeri | netstandard2.1 | gü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ız | Güncel |
Viewer bağımlılık enjeksiyonu ile sağlanır | Gü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:
| Host | 26.8.0'i tüketebilir |
|---|---|
| .NET Core 3.0 veya ü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 her iki referans uygulaması da net8.0 hedefler.
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 bir
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, görüntüleyici 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ışına koruyun. - PDF, Office, görüntü, CAD, e-posta, DICOM, aranabilir, şifre korumalı ve açıklamalı belgelerden temsili 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â 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:
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 iletin:
dotnet add package Doconut.NETStandard --version 26.8.0Her 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:
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 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:
// Ö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:
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 Viewerkullanı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:
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:
- oturum güvenliği etkinken Doconut'tan önce
UseSession()çağırın; UseDoconut()'den önceUseDoconutResources()çağırın;ResourcesPath, oluşturulan kaynak URL'lerini ve istemciResPath'yi hizalı tutun;- 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:
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:
// 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:
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.
// Ö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:
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 = /* yukarıdaki SAME FileShareConfig */;
}, "/"));| Önce | Şimdi |
|---|---|
WebFarmOptions.Path | FileShareConfig.RootPath |
PageWaitTimeSeconds / StartWaitFromPage | gitti — 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 / WebfarmPath | hâ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
RootPathveyaUsePerTokenSubfoldersfarklı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:
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);
// 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
*ConfigConvertertürleri (WordConfigConverter,ExcelConfigConverter, …), her biri iç içe birEnTargetFormatenum ile — kaldırıldı. Artık her aile için birConversionTargetenum var. viewer.Converter.GetConverter()— kaldırıldı.Doconut.DocumentConverterenjekte 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:
// Ö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.UnSafeMode | UnsafeMode |
DocOptions.IsWebfarm | IsWebFarm |
DocOptions.WebfarmPath | WebFarmPath |
DocOptions.ImageResolution | hâ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:
| Konu | Mevcut tip |
|---|---|
| Ara katman yolları, lisanslama, eklenti kaydı | DoconutOptions |
| Şifre, zaman aşımı, güvenlik, filigran | DocOptions |
| Format renderleme ve DPI | PdfConfig, 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 betikler | CssConfig 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:
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
ResPath: '', // ÖNCE — kaynaklar uygulama kökünden geliyordu
ResPath: 'doconut-res/images', // ŞİMDİ — UseDoconutResources() öneki bağlarEğ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:
- Viewer CSS ve lisanslı Arama/Açıklama CSS'lerini
ReferenceCssile yayınlayın; - Uygulama sahipliğindeki Viewer araç çubuğunu render edin;
searchBarMount,annBarMountve gerekli Viewer bağlamasını render edin;- Viewer ve lisanslı modül betiklerini
ReferenceScriptsile 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 Şerit üzerinde
attach(objViewer)çağırın; - 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:
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:
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ı
- Ana çerçevenin netstandard2.1'i tüketebileceğini doğrulayın. Eğer tüketemiyorsa, durun.
- Paketi 26.8.0'a yükseltin ve derleyin. Derleme hatalarını giderin — çoğu §1'deki
usingsatırlarıdır. - Başlangıcı
AddDoconut()'ye taşıyın ve ara katman çağrılarını yeni sıralarına (§3, §4) yerleştirin. Viewer'yi oluşturduğunuz yere enjekte edin,OpenDocument'yi async yapın veInitCache()'yi silin (§5, §6).- Web farmını kullanıyorsanız, §7'yi yapın — yeniden adlandırma yerine tek yeniden tasarım kısmı.
- Belgeleri dönüştürüyorsanız, §8'i yapın.
- §11'i yapın — istemci tarafı değişiklikler. Bunlar kendilerini duyurmayacak olanlardır.
- 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
202yanı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?