บทแนะนำ: เปิดเอกสารด้วย Doconut Viewer ที่ฉีดเข้าใน .NET 8
← Back to Blog••3 min read

บทแนะนำ: เปิดเอกสารด้วย Doconut Viewer ที่ฉีดเข้าใน .NET 8

บทนำ

ตัวอย่าง Doconut รุ่นเก่าอาจสร้าง Viewer โดยตรงด้วยอาร์กิวเมนต์ cache, HTTP-context, และ license-path นั่นไม่ใช่โมเดลการบูรณาการของ .NET 8 ปัจจุบัน AddDoconut() ลงทะเบียน Viewer ด้วย dependency injection และ endpoint ของแอปพลิเคชันจะรับบริการแทนการเรียกคอนสตรัคเตอร์.

ส่วนประกอบเซิร์ฟเวอร์เชิงนามธรรมส่ง token เซสชันที่ไม่เปิดเผยไปยังพื้นผิวการดูเอกสาร
ส่วนประกอบเซิร์ฟเวอร์เชิงนามธรรมส่ง token เซสชันที่ไม่เปิดเผยไปยังพื้นผิวการดูเอกสาร

บทแนะนำนี้ทำตามลำดับการร้องขอปัจจุบัน: ลงทะเบียนบริการและ middleware, ส่งออกทรัพยากร viewer ที่ฝังอยู่, เปิดเอกสารด้วย OpenDocumentAsync, คืนค่า token เซสชันที่ไม่เปิดเผย, และส่ง token นั้นไปยังวิดเจ็ตของเบราว์เซอร์.


1. ติดตั้งและลงทะเบียน Doconut

เพิ่มแพคเกจ .NET 8:

dotnet add package Doconut.NET8

ลงทะเบียน Doconut และบริการเซสชันของ ASP.NET:

builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
    options.MiddlewarePath = "/doconut";
    options.ResourcesPath = "/doconut-res";
    options.UnsafeMode = false;
});

builder.Services.AddSession();

เชื่อมต่อ middleware ตามลำดับที่ต้องการ Middleware ของทรัพยากรต้องทำงานก่อน middleware ของเอกสารขั้นสุดท้าย:

app.UseRouting();
app.UseSession();
app.UseDoconutResources();
app.Map("/doconut", branch => branch.UseDoconut());

MiddlewarePath ประสานการกำหนดค่าแต่ไม่ได้สร้างสาขา ASP.NET ด้วยตัวเอง เส้นทางที่แมพ /doconut ต้องตรงกับ BasePath ของวิดเจ็ต.

2. เพิ่มพื้นผิว viewer และทรัพยากร

Doconut browser viewer เป็นปลั๊กอิน jQuery ในหน้า Razor ให้ฉีด Viewer และขอให้มันส่งออกแท็กทรัพยากรตามลำดับการพึ่งพา:

@inject Doconut.Viewer Viewer

@Html.Raw(Viewer.ReferenceCss(new CssConfig
{
    IncludeViewerCss = true
}))

@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig
{
    IncludeJQuery = true,
    IncludeViewerScripts = true
}))

<div id="divDocViewer">
    <div id="div_ctlDoc"></div>
</div>

เริ่มต้นวิดเจ็ตด้วยเส้นทางที่ตรงกับการลงทะเบียนบนเซิร์ฟเวอร์:

const objViewer = $('#div_ctlDoc').docViewer({
    showThumbs: true,
    autoLoad: false,
    pageZoom: 100,
    FitType: 'width',
    BasePath: '/doconut',
    ResPath: '/doconut-res/images',
    onError: function (message) {
        console.error('Doconut viewer error:', message);
    }
});

การตั้งค่าตัวพิมพ์ใหญ่‑เล็กมีความสำคัญ ใช้ชื่อที่แสดงโดยเวอร์ชันที่ติดตั้งแทนการทำให้เป็นรูปแบบเดียวกัน.

3. ฉีด Viewer และเปิดเอกสาร

Viewer ลงทะเบียนเป็นบริการแบบ transient ให้ดึงผ่านการฉีด endpoint, การฉีดคอนสตรัคเตอร์ หรือกลไกที่เทียบเท่าในแอป ASP.NET Core ของคุณ.

app.MapPost("/api/open", async (
    Viewer viewer,
    CancellationToken ct) =>
{
    string token = await viewer.OpenDocumentAsync(
        "wwwroot/files/Sample.pdf",
        ct: ct);

    return Results.Ok(new { token });
});

สำหรับการอัปโหลด ให้สตรีมและ FileInfo ที่ส่วนขยายระบุรูปแบบแหล่งที่มา:

app.MapPost("/api/open-upload", async (
    IFormFile file,
    Viewer viewer,
    CancellationToken ct) =>
{
    await using var stream = file.OpenReadStream();
    string token = await viewer.OpenDocumentAsync(
        stream,
        new FileInfo(file.FileName),
        ct: ct);

    return Results.Ok(new { token });
});

ตรวจสอบขนาดการอัปโหลด, ส่วนขยาย, และการอนุญาตก่อนเปิดเนื้อหาที่ผู้ใช้ส่งมา ห้ามเปลี่ยนชื่อไฟล์ที่ส่งเป็นเส้นทางบนเซิร์ฟเวอร์.

4. ส่ง token ไปยัง widget

ดึง endpoint ที่เปิดและส่ง token ที่ได้กลับไปยัง objViewer.View:

fetch('/api/open', { method: 'POST' })
    .then(response => {
        if (!response.ok) throw new Error('The document could not be opened.');
        return response.json();
    })
    .then(data => objViewer.View(data.token))
    .catch(error => console.error(error));

ถือ token ว่าเป็นข้อมูลรับรองแบบ bearer สำหรับเซสชันเอกสารสด:

  • ห้ามบันทึกหรือเก็บรักษาไว้
  • คืนค่าให้เฉพาะไคลเอนต์ที่ได้รับอนุญาต
  • ห้ามเปิดเผยเส้นทางไฟล์ต้นฉบับ
  • เปิดเอกสารใหม่เมื่อเซสชันหมดอายุ
  • ปิดเซสชันเมื่อเอกสารไม่จำเป็นต้องใช้ต่อ

5. ปิดเซสชันฝั่งเซิร์ฟเวอร์โดยเจตนา

โค้ดฝั่งคลไอเอนท์สามารถเรียก objViewer.Close() เมื่อผู้ใช้ออกจาก viewer ได้ กระบวนการฝั่งเซิร์ฟเวอร์ก็สามารถเพิกถอน token ที่รู้จักโดยชัดเจน:

app.MapPost("/api/close", (string token, Viewer viewer) =>
{
    viewer.CloseDocument(token);
    return Results.NoContent();
});

การปิดแบบชัดเจนมีประโยชน์เป็นพิเศษสำหรับเอกสารขนาดใหญ่ การหมดอายุของเซสชันยังคงเป็นวิธีสำรอง ไม่ใช่การแทนที่การจัดการวงจรชีวิตแอปพลิเคชันที่คาดเดาได้.

6. เพิ่มโมดูลเสริมหลังจากส่วนหลักทำงาน

การค้นหาและคำอธิบายแนบกับ viewer ที่ได้เริ่มต้นแล้ว ให้เพิ่ม CSS, สคริปต์, การเมานท์, การตรวจสอบลิขสิทธิ์, และคอลแบ็กของวงจรชีวิตเฉพาะหลังจากกระบวนการหลักสำเร็จ:

AddDoconut + session services
    -> UseSession
    -> UseDoconutResources
    -> mapped UseDoconut branch
    -> viewer resources and mount
    -> initialize docViewer
    -> OpenDocumentAsync
    -> objViewer.View(token)

ลำดับนี้ทำให้ความล้มเหลวของการเรนเดอร์ส่วนหลักแยกจากการกำหนดค่าโมดูลเสริมได้อย่างชัดเจน.

ข้อผิดพลาดทั่วไปในการย้าย

รูปแบบเก่าหรือไม่ถูกต้องแนวทาง .NET 8 ปัจจุบัน
new Viewer(cache, accessor, licensePath)ฉีด Viewer หลังจาก AddDoconut()
การเรียกโหลดใบอนุญาตแบบคงที่ในโค้ดคำขอกำหนดค่าการป้อนใบอนุญาตใน AddDoconut()
ตัวอย่าง OpenDocument(...) แบบซิงโครนัสใช้ OpenDocumentAsync(...)
CDN viewer ภายนอกหรือที่สร้างขึ้นส่งออกทรัพยากรฝังด้วย ReferenceCss และ ReferenceScripts
API init() ของ JavaScript ทั่วไปเริ่มต้น $('#div_ctlDoc').docViewer(...)
การเก็บ token ของ viewerเก็บ ID ของเอกสารของคุณ; ปฏิบัติกับ token ว่าเป็นชั่วคราว

ใช้ เอกสาร Doconut อย่างเป็นทางการ และตรวจสอบตัวอย่างกับเวอร์ชันแพคเกจที่ติดตั้งก่อนนำไปปรับใช้ในโค้ดผลิตจริง.

#Doconut#.NET 8#ตัวดูเอกสาร#ASP.NET Core#JavaScript