การย้าย

Doconut.NETFramework 26.8.0 (.NET Framework 4.7) ไปยัง 26.9.0 (.NET Framework 4.7.2)

หน้านี้ครอบคลุมการอัปเกรดแอปพลิเคชัน ASP.NET ที่มีอยู่จาก Doconut.NETFramework 26.8.0 หรือก่อนหน้า (.NET Framework 4.7) ไปเป็น 26.9.0 และรุ่นต่อไป (.NET Framework 4.7.2) แพ็กเกจตัวอย่าง Doconut มีคู่มือการย้ายทั้งหมดและตัวอย่างคลาสสิกที่พอร์ตไปยัง API ใหม่ — MVC 5, เว็บฟาร์ม, และ Web Forms การเปรียบเทียบแอปของคุณกับตัวอย่างที่เริ่มต้นเป็นวิธีที่เร็วที่สุด

แพ็กเกจเดียว, สองเวอร์ชัน

ทั้งสองไลบรารีเผยแพร่ภายใต้ ID ของแพ็กเกจเดียวกัน, Doconut.NETFramework. เวอร์ชันทำให้แยกแยะได้:

เวอร์ชันเป้าหมายAPI
26.8.0 และก่อนหน้า.NET Framework 4.7API ก่อนหน้า
26.9.0 และต่อไป.NET Framework 4.7.2API ใหม่

การอัปเดตแพ็กเกจคือการอัปเกรด ไม่มีแพ็กเกจแยกต่างหากให้ติดตั้งและไม่มีชั้นความเข้ากันได้: 26.9.0 มี API ที่แตกต่างกัน ดังนั้นคาดว่าจะมีข้อผิดพลาดในการคอมไพล์หลังการอัปเดต — รายละเอียดต่อในหน้านี้ เส้นทาง .NET Framework 4.7 ถูกยกเลิกและ 26.8.0 เป็นรุ่นสุดท้ายของมัน คุณสามารถคงอยู่บนรุ่นนั้นได้ — ไม่มีการแก้ไขความปลอดภัยใด ๆ ที่คุณจะพลาด — แต่การปล่อยเวอร์ชันใหม่, ปลั๊กอิน, โหมดกระจาย, และวิดเจ็ตแบบดรอป‑อิน จะมีเฉพาะใน 26.9.0 และรุ่นต่อไป

1. ปรับเป้าหมายและอัปเดตแพ็กเกจ

ปรับเป้าหมายโครงการเว็บเป็น .NET Framework 4.7.2 ก่อน: โครงการที่ยังเป้าหมายเป็น 4.7 ไม่สามารถติดตั้ง 26.9.0 ได้ และ NuGet ปฏิเสธการอัปเดต จากนั้นอัปเดต Doconut.NETFramework และเพิ่มแพ็กเกจปลั๊กอินที่คุณใช้ (Doconut.NETFramework.Converter, Doconut.NETFramework.Dicom, …) แต่ละปลั๊กอินต้องมีใบอนุญาตที่ให้สิทธิ์

หากโครงการใช้ packages.config การอัปเดตจะดำเนินขั้นตอนการถอนการติดตั้งของเวอร์ชันก่อนหน้า ซึ่งจะลบตัวจัดการ DocImage จาก Web.config และ 26.9.0 จะไม่เพิ่มกลับมา ลงทะเบียนใหม่ตามที่แสดงในขั้นตอนที่ 3; จนกว่าคุณจะทำเช่นนั้น DocImage.axd จะตอบ 404 และไม่มีหน้าใดแสดงผล

2. เนมสเปซ: เกือบทุกอย่างถูกย้ายไปที่รูท

ก่อนหลัง
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;ไม่เปลี่ยนแปลง

ชื่อประเภทไม่ได้เปลี่ยนแปลง: WordConfig, PdfConfig, ExcelConfig, CssConfig, ScriptConfig, FileShareConfig และส่วนที่เหลือทั้งหมดยังคงอยู่ ในไฟล์ส่วนใหญ่การแก้ไขทั้งหมดคือการลบบรรทัด using

3. การเริ่มต้น: DoconutHost.Initialize และสองรายการใน Web.config

แพ็กเกจคลาสสิกสร้างตัวดูของมันต่อคำขอ โดยมีตัวเลือกเป็นคุณสมบัติของอินสแตนซ์นั้น แพ็กเกจใหม่มี composition root ที่สร้างครั้งเดียวใน Application_Start และตัวดูเป็นบริการที่คุณเรียกใช้:

csharp
// ก่อน - Doconut.NETFramework 26.8.0 และก่อนหน้า, ตามคำขอ
var viewer = new Viewer
{
    ID = "ctlDoc",
    IncludeJQuery = true,
    BasePath = "/",
    FitType = "width"
};
csharp
// Doconut.NETFramework 26.9.0+ - ตัวดูเอกสารได้รับการแก้ไขจาก DoconutHost, ใบอนุญาตกำหนดค่าเพียงครั้งเดียวใน DoconutHost.Initialize()
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
var token  = await viewer.OpenDocumentAsync(path, new PdfConfig { AllowSearch = true });

DoconutHost.Initialize ไปอยู่ใน Application_Start และ DoconutHost.Shutdown อยู่ใน Application_End, และ Web.config จะได้รับตัวจัดการ DocImage.axd และโมดูลทรัพยากร — ทั้งสองอยู่ใน การติดตั้ง การตั้งค่าการแสดงผลต่อหน้า (FitType, FixedZoom, ShowHyperlinks, …) ถูกย้ายจากอินสแตนซ์ของตัวดูไปยังตัวเลือกของวิดเจ็ต หรือไปยัง ViewerConfig ที่ส่งให้กับ Viewer.RenderViewer (ดู การกำหนดค่า Viewer) new Viewer() ยังคอมไพล์ได้เมื่อ DoconutHost.Initialize ทำงานแล้ว ดังนั้นโค้ด‑เบื้องหลังที่ย้ายมาสามารถคงบรรทัดนั้นไว้ขณะย้ายการตั้งค่า

ความปลอดภัยทำงานเช่นเดิม. การเปิดเอกสารให้เซสชัน ASP.NET ปัจจุบันเข้าถึงหน้าต่าง ๆ ของมัน, และ DocImage.axd ปฏิเสธทุกคนอื่น การตั้งค่าแอป DoconutUnSafeMode ที่ปิดการทำงานนี้ตอนนี้เป็น options.UnsafeMode ใน DoconutHost.Initialize — ให้คงไว้เป็น false ดู เซสชัน & ความปลอดภัย

ความล้มเหลวในการเริ่มต้นที่ทำให้ทั้งไซต์หยุดทำงาน. ปลั๊กอินที่ลงทะเบียนซึ่งความสามารถไม่ได้รับใบอนุญาตจะโยนข้อผิดพลาดใน Application_Start, และแอปพลิเคชันจะตอบกลับด้วย 500 ว่างเปล่าสำหรับทุกคำขอ — ไม่มีหน้าข้อผิดพลาด, ไม่มีอะไรในบันทึก IIS, มีเพียงรายการในบันทึกเหตุการณ์ของ Windows (source ASP.NET) ใบอนุญาตจะถูกอ่านจาก wwwroot ใต้รูทของไซต์และไม่มีที่อื่น, และฐาน Doconut.Viewer.lic ต้องมีอยู่ มิฉะนั้นใบอนุญาตของปลั๊กอินที่อยู่ข้างๆ จะไม่ถูกอ่าน ดู การตั้งค่าใบอนุญาต.

4. ฟาร์มเว็บ: จากสภานักธงสู่โหมดกระจาย

โมเดลคลาสสิกคือ viewer.IsWebfarm = true บวกกับ ExportToPng(path). โมเดลใหม่ลงทะเบียนเพียงครั้งเดียว: ทุกโหนดแชร์ที่เก็บเดียวและคีย์การลงนามเดียว, และตั๋วที่ลงนามผูกกับเบราว์เซอร์จะแทนที่ “โหนดใดโหนดหนึ่งที่ตอบกลับ”:

csharp
Doconut.DoconutHost.Initialize(
    options => options.UnsafeMode = false,
    services => services.AddDoconutDistributed(d =>
    {
        d.Store             = CloudLocation.FileShare;
        d.FileShareRootPath = @"\\fileserver\doconut-shared";   // WebfarmPath เป็นนามแฝง
        d.SigningKey        = farmKey;                           // >= 32 bytes, เหมือนกันบนทุกโหนด
    }));

จากนั้นเปิดเอกสารตามปกติ, ผูกเบราว์เซอร์ (DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(...)) และส่ง viewer.AccessToken ให้กับวิดเจ็ตพร้อมโทเค็น. เซสชันและความปลอดภัย มีขั้นตอน; ตัวอย่างเว็บฟาร์มเป็นโหนดที่สมบูรณ์. IsWebfarm และ WebfarmPath ยังคอมไพล์ได้, แต่พวกมันไม่สลับอะไรอีกต่อไป.

สองสิ่งที่ดูเหมือนสำเร็จแต่จริงๆ ไม่ใช่: DistributedDocumentPublisher.PublishAsync เขียนไฟล์ที่แสดงผลของเอกสารแต่ไม่เปิดเซสชัน, ดังนั้นผู้ชมที่ชี้ไปที่โทเค็นที่เผยแพร่จะได้รับภาพข้อผิดพลาดขนาด ~2 KB พร้อมสถานะ 200; และไคลเอนต์ทดสอบที่ไม่มีคุกกี้ doconut-client จะได้รับภาพเดียวกัน, ไม่ใช่ 401. แยกหน้าจริงจากภาพข้อผิดพลาดโดยขนาด.

5. การแปลงเป็นปลั๊กอินและเล็กลงมาก

enum SourceFormatConverter, คลาส *ConfigConverter จำนวนสิบสองคลาส, และ enum เป้าหมายที่ซ้อนกันของพวกมันถูกแทนที่ด้วย enum หนึ่งตัว, ConversionTarget, และการเรียกหนึ่งครั้ง:

csharp
using System.IO;
using System.Threading;
using Doconut;
using Doconut.Configs.Conversion;

// สมมติว่า DoconutHost ได้รับการเริ่มต้นแล้วและ CancellationToken ที่ชื่อ ct มีพร้อมใช้งาน
var provider = DoconutHost.Services;
var converter = (DocumentConverter)provider.GetService(typeof(DocumentConverter));
Stream source = /* สตรีมอินพุตของคุณ */;
var result = await converter.ConvertAsync(source, ".dwg", ConversionTarget.Pdf, null, ct);

รูปแบบต้นทางมาจากส่วนขยายที่คุณส่ง. ไม่มี shim ความเข้ากันได้: การอ้างอิง SourceFormatConverter ทุกอันเป็นข้อผิดพลาดการคอมไพล์ที่คุณต้องแก้โดยลบออก. วัตถุตัวเลือกต่อรูปแบบไม่ได้อยู่ต่อ — WordConfigConverter.HtmlOptions และ CadConfigConverter.CadOptions.ShowColor ไม่มีเทียบเท่าผ่าน ConvertAsync. ใน Web Forms, อย่าเคยบล็อกบน ConvertAsync — ดู ปลั๊กอินแปลง.

6. ที่เก็บข้อมูลบนคลาวด์: เข้าถึงเป็นโฟลเดอร์ที่แชร์

ประเภทการกำหนดค่าคลาวด์ย้ายไปยัง Doconut.Clouds โดยไม่เปลี่ยนแปลง. อย่างไรก็ตามตัวจัดการคำขอคลาวด์เป็นคอมโพเนนต์ ASP.NET Core, และแอปพลิเคชันคลาสสิกไม่มี pipeline ให้รันพวกมัน. จากไซต์ System.Web, เข้าถึงที่เก็บคลาวด์เป็น โฟลเดอร์ที่แชร์ — บน Azure, การแชร์ Azure Files ที่เมานท์บนแต่ละโหนด — เข้าถึงผ่าน FileShareConfig.

7. การเปลี่ยนแปลงด้านไคลเอนต์ที่ล้มเหลวโดยเงียบ

รายการต่อไปนี้ทั้งหมดคอมไพล์, ทำงาน, ไม่บันทึกอะไร, และทำสิ่งที่ผิด:

ก่อนหลัง
ResPath: 'doconut-res'ResPath: 'doconut-res/images' — มิฉะนั้นไอคอนทุกอันจะคืนค่า 404 ขณะเอกสารแสดงผล
function ctlDoc_ViewerReady() { }docViewer({ onViewerReady: function () { } }) — การเรียกกลับของผู้ชมเป็นตัวเลือกแล้ว
var viewer = $(el).docViewer({...}).View(token)กำหนด docViewer(...) ก่อน, จากนั้นเรียก viewer.View(token) แยกกัน
viewer.Refit() เพื่อให้พอดีกับหน้าviewer.FitType('width') — Refit() เพียงคำนวณเลย์เอาต์ใหม่
var n = viewer.Search(kw, exact)viewer.Search(kw, exact, function (n) { … }) — จำนวนจะมาถึงในการเรียกกลับ
if (viewer.SaveAnnotations()) { … }docViewer({ onAnnSaved: …, onAnnSaveError: … })
function ctlDoc_Created() { } (คำอธิบาย)ไม่เปลี่ยนแปลง — ฟังก์ชันเหตุการณ์คำอธิบายยังคงเป็น global, ค้นหาตามชื่อ

อีกสามข้อ: ผู้ชมไม่วาดแถบเครื่องมือของตนเอง (หน้าของคุณเชื่อมต่อ Zoom, Next, GotoPage และส่วนที่เหลือกับปุ่มของมันเอง); ผู้ชมที่สร้างภายในโมดัล Bootstrap ที่ซ่อนอยู่มีขนาด 0×0 และไม่วาดอะไรจนกว่าคุณจะกำหนดความสูงให้กับคอนเทนเนอร์อย่างชัดเจนและปรับขนาดใหม่บน shown.bs.modal; และ AllowSearch ตั้งค่าเริ่มต้นเป็น false สำหรับ PDF, ดังนั้นเอกสารจะแสดงผลอย่างสมบูรณ์ในขณะที่การค้นหาทั้งหมดไม่คืนค่าอะไร.

8. สิ่งที่หายไป

หายไปแทนที่
DocumentSearch / TextSearch.csไม่มี — การค้นหาจะทำงานบนข้อความที่ตัวดูรูปแบบสกัดออก
Viewer.WatermarkInfoไม่มีเทียบเท่า
WordConfigConverter.HtmlOptionsไม่มีวัตถุ option ผ่าน ConvertAsync
SourceFormatConverter, คลาส *ConfigConverterConversionTarget and ConvertAsync
Doconut.Configs.Editorถูกลบ
viewer.IsWebfarm + ExportToPng(path)AddDoconutDistributed และการเปิดแบบปกติ

ลำดับการทำงานที่แนะนำ

  1. เปลี่ยนเป้าหมาย, สลับแพ็กเกจ, และทำให้ Global.asax คอมไพล์ด้วย DoconutHost.Initialize และการลงทะเบียน Web.config ทั้งสอง. เว็บไซต์ควรเริ่มทำงาน.
  2. หน้า viewer หนึ่ง: ทำให้เอกสารแสดงผล, จากนั้นทำงานผ่านส่วนที่ 7 จนแถบเครื่องมือ, การค้นหา, และคำอธิบายทำงานตามปกติ. ตรวจสอบในเบราว์เซอร์จริง — ไม่มีอะไรในส่วนนั้นทำให้เกิดข้อผิดพลาด.
  3. การแปลง (ส่วนที่ 5): เป็นกระบวนการเชิงกล, และส่วนใหญ่ของข้อผิดพลาดการคอมไพล์.
  4. หน้าที่เหลือ, ใช้ตัวอย่างที่พอร์ตเป็นเป้าหมายการเปรียบเทียบ.
  5. เว็บฟาร์ม (ส่วนที่ 4), หากคุณมี. ทดสอบด้วยโหนดสองตัวและเบราว์เซอร์, หรือไคลเอนต์ที่เก็บคุกกี้.

หน้านี้เป็นประโยชน์หรือไม่?