ASP.NET Core

Ba lời gọi middleware, không phải viết lại

Doconut được đăng ký giống như mọi thứ khác trong ASP.NET Core: một dịch vụ trong container và middleware trong pipeline. Nó kế thừa xác thực, ghi log, đồ thị DI và cách triển khai của bạn, vì nó chạy bên trong chúng chứ không phải bên cạnh.

3
lời gọi middleware để tích hợp
75
định dạng tệp hỗ trợ sẵn
2
đích triển khai: Windows, Docker

Vấn đề

Chi phí tích hợp mà không ai dự trù

Hầu hết các trình xem tài liệu xuất hiện như một dịch vụ riêng biệt. Điều đó đồng nghĩa với một đơn vị triển khai thứ hai, một bộ thông tin đăng nhập thứ hai, một bước mạng mà tài liệu của bạn phải đi qua, và một vấn đề thứ hai để gọi ai đó vào lúc 2 giờ sáng.

Doconut là một thư viện. AddDoconut() đưa nó vào bộ sưu tập dịch vụ của bạn; UseDoconut() đưa nó vào pipeline. Nó chạy dưới danh tính tiến trình của bạn, đọc cấu hình, ghi vào logger, và được triển khai bởi bất kỳ công cụ nào đã triển khai ứng dụng của bạn.

Hệ quả thực tế là quyền truy cập vẫn ở đúng chỗ. Bạn gọi OpenDocumentAsync() sau khi kiểm tra quyền của mình, và trình xem chỉ có thể render những gì bạn đã quyết định cung cấp.

Khả năng

Những gì middleware mang lại cho bạn

Razor Pages, MVC và API tối thiểu

Trình xem không bị ràng buộc vào kiểu hosting nào. Render thẻ div gắn trong Razor view hoặc trang tĩnh và mở tài liệu từ một hành động controller, một page handler hoặc một endpoint đã được ánh xạ.

Xác thực của bạn, không thay đổi

Vì các endpoint nằm trong pipeline của bạn, [Authorize] hoạt động như mọi lúc. Không có hệ thống danh tính thứ hai để liên kết.

Bảo mật tài liệu dựa trên session

Bảo mật tài liệu dựa trên trạng thái session của ASP.NET, vì vậy UseSession() phải được đăng ký trước UseDoconut(). Điều này có nghĩa khái niệm về người dùng trong trình xem giống với ứng dụng.

Sẵn sàng cho web farm

Nhiều node phía sau load balancer chia sẻ bộ nhớ cache render, vì vậy một session mở trên một node vẫn hoạt động khi yêu cầu tiếp theo đến node khác.

Windows hoặc Docker

IIS, Kestrel, hoặc một image container bạn tự xây dựng. Không có gì thay đổi trong việc tích hợp giữa chúng ngoại trừ vị trí gắn file giấy phép.

Chuyển đổi trong cùng pipeline

Với plugin Converter, DocumentConverter.ConvertAsync() chạy trong cùng một tiến trình — không có dịch vụ thứ hai, không tải lên tạm thời, không vòng quay.

Tích hợp

Đăng ký và một endpoint mở

UserMayRead và ResolvePath là mã của bạn. Đó là mục đích: Doconut không bao giờ biết tài liệu nào tồn tại hoặc ai được phép xem chúng.

Các nền tảng được hỗ trợ

Razor PagesMVCMinimal APIs.NET 8.NET 6WindowsDocker
csharp
// Program.cs
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession(); // document security rides on session state

var app = builder.Build();

app.UseSession();          // call UseSession() before UseDoconut()
app.UseDoconutResources(); // must be registered before UseDoconut()
app.UseDoconut();

// Open the document server-side, behind your own authorization
app.MapPost("/api/open", async (Viewer viewer, HttpContext ctx, string documentId) =>
{
    if (!await ctx.UserMayRead(documentId))
        return Results.Forbid();

    // The token is opaque — hand it to the widget, never log or persist it.
    string token = await viewer.OpenDocumentAsync(ResolvePath(documentId));
    return Results.Ok(new { token });
}).RequireAuthorization();

Chi tiết

Thứ tự đăng ký và các lưu ý

  • UseSession() phải được gọi trước UseDoconut(). Bảo mật tài liệu phụ thuộc vào nó.
  • UseDoconutResources() phải được gọi trước UseDoconut(), và nên nằm sau cùng một xác thực như phần còn lại của ứng dụng.
  • Razor view chèn Doconut.Viewer và phát ra ReferenceCss / ReferenceScripts; jQuery phải được tải trước các script của trình xem.
  • Đặt options.LicensePath từ cấu hình để file giấy phép có thể được gắn như một bí mật thay vì nhúng vào image.

Câu hỏi thường gặp

Nó có hoạt động với .NET 6 cũng như .NET 8 không?

Có. Cả hai đều được hỗ trợ và sử dụng cùng kiến trúc DI cộng với middleware. Có các trang riêng cho mỗi phiên bản nếu bạn cần chi tiết theo phiên bản.

Có thành phần Razor hoặc tag helper không?

Không, và đó là ý định. Tích hợp luôn là middleware cộng với widget JavaScript, giữ cho việc tích hợp nhất quán trên Razor Pages, MVC, Web Forms và Blazor thay vì chia thành bốn phần.

Nó hoạt động như thế nào phía sau load balancer?

Web farm và triển khai phân tán được hỗ trợ thông qua bộ nhớ cache render chung. Một tài liệu mở trên một node vẫn có thể đọc được khi các yêu cầu tiếp theo đến node khác.

Tôi có cần cài Office trên máy chủ không?

Không. Việc render là nguyên bản — không có interop Office, không có Word không giao diện, và không có tự động hoá COM để quản lý.

Thử nó với tài liệu của bạn

Giấy phép tạm thời mất vài phút để yêu cầu và chạy hoàn toàn trên máy của bạn. Những tệp quan trọng là những tệp đã gây ra lỗi cho trình xem hiện tại của bạn.