Razor Pages, MVC ו‑APIs מינימליים
הצופה אינו קשור לסגנון אירוח. רנדר את div ההרכבה מתצוגת Razor או מדף סטטי ופתח את המסמך מפעולת בקר, מטפל דף או נקודת קצה ממופה.
Doconut נרשם כמו כל דבר אחר ב‑ASP.NET Core: שירות במכולה ו‑middleware בצינור. הוא יורש את האימות שלך, את הרישום שלך, את גרף ה‑DI שלך ואת סיפור הפריסה שלך, מכיוון שהוא פועל בתוכם ולא לצידם.
הבעיה
רוב צופי המסמכים מגיעים כשירות נפרד. משמעות הדבר היא יחידת פריסה שנייה, סט נוסף של אישורים, קפיצה ברשת שהמסמכים שלך עוברים דרכה, ודבר נוסף שמישהו יקבל הודעה עליו ב‑2 בלילה.
Doconut היא ספרייה. AddDoconut() מוסיפה אותה לאוסף השירותים שלך; UseDoconut() מוסיפה אותה לצינור. היא פועלת תחת זהות התהליך שלך, רואה את ההגדרות שלך, כותבת לרשומות שלך, ומופצת על ידי מה שכבר מפיץ את היישום שלך.
התוצאה המעשית היא שהאימות נשאר במקום שלו. אתה קורא ל‑OpenDocumentAsync() אחרי בדיקת ההרשאות שלך, והצופה יכול רק להציג את מה שהחלטת להעביר לו.
יכולות
הצופה אינו קשור לסגנון אירוח. רנדר את div ההרכבה מתצוגת Razor או מדף סטטי ופתח את המסמך מפעולת בקר, מטפל דף או נקודת קצה ממופה.
מאחר שהנקודות קצה חיות בצינור שלך, [Authorize] פועלת כפי שתמיד פעלה. אין מערכת זהות שנייה לשיתוף.
אבטחת המסמכים מתבססת על מצב הסשן של ASP.NET, ולכן UseSession() חייבת להיות רשומה לפני UseDoconut(). המשמעות היא שההבנה של הצופה לגבי מי אתה היא זהה לזו של היישום.
מספר צמתים מאחורי מאזן עומס חולקים את מטמון הרינדור, כך שסשן שנפתח בצומת אחד ממשיך לעבוד כאשר הבקשה הבאה מגיעה לצומת אחר.
IIS, Kestrel, או תמונת קונטיינר שאתה בונה בעצמך. שום דבר באינטגרציה לא משתנה ביניהם חוץ מהמיקום שבו קובץ הרישיון מותקן.
עם תוסף Converter, DocumentConverter.ConvertAsync() פועל באותו תהליך — ללא שירות שני, ללא העלאה זמנית, ללא נסיעה חזרה.
אינטגרציה
UserMayRead ו‑ResolvePath הם הקוד שלך. זהו העיקר: Doconut לעולם לא לומד אילו מסמכים קיימים או מי מורשה לראות אותם.
פלטפורמות נתמכות
// 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();פרטים
כן. שני הגרסאות נתמכות ומשתמשות באותה ארכיטקטורה של DI בתוספת middleware. יש דפים ייעודיים לכל אחת אם אתה צריך פרטים ספציפיים לגרסה.
לא, וזה מכוון. האינטגרציה היא תמיד middleware בתוספת הווידג'ט JavaScript, מה ששומר על אינטגרציה אחידה בין Razor Pages, MVC, Web Forms ו‑Blazor במקום לפצל לארבעה.
חוות רשת ופריסה מבוזרת נתמכות דרך מטמון רינדור משותף. מסמך שנפתח בצומת אחד נשאר קריא כאשר בקשות נוספות מגיעות לצומת אחר.
לא. הרינדור הוא מקורי — אין אינטרופ עם Office, אין Word ללא ממשק, ואין אוטומציה של COM לטיפול.
רשיון זמני לוקח כמה דקות לבקשה ופועל לחלוטין במחשב שלך. הקבצים החשובים הם אלו שכבר מפריעים לצופה הנוכחי שלך.