DoconutOptions

הגדרת שירותי Doconut

DoconutOptions (namespace Doconut) הוא אובייקט התצורה היחיד לכל ה‑SDK. אתה מגדיר אותו פעם אחת, בתוך AddDoconut(), והוא נרשם כסינגלטון.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath     = "Doconut.Viewer.lic";
    options.UnsafeMode      = false;
    options.ShowDoconutInfo = false;
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

מאפיינים

סוגמאפייןברירת מחדלתיאור
boolShowDoconutInfofalseכאשר true, בקשת middleware ללא טוקן מחזירה באנר גרסה (Doconut <version> is running on <host>) במקום 404. שימושי לבדיקת עישון; השאר false בייצור.
boolUnsafeModefalseכאשר true, מדלג על בדיקת האבטחה של ASP.NET‑session בבקשות דף. השאר false בייצור (ראה מושגים מרכזיים → הפעלות ואבטחה).
stringMiddlewarePath"/doconut"ערך תיאום לנקודת הקצה של דף‑תמונה. הוא מאומת, אך אינו יוצר ענף צינור; שמור אותו תואם למיפוי האמיתי של UseDoconut() ול‑BasePath של הלקוח.
stringResourcesPath"/doconut-res"קידומת נתיב URL למשאבים המוטמעים של JS/CSS/תמונה/גופן.
stringLicensePath""נתיב לקובץ הרישיון. ריק → מקור רישיון הבא, ואז גילוי אוטומטי; אם לא נמצא דבר → מצב הערכה עם סימן מים וללא יכולות.
stringLicenseContent""תוכן רישיון XML גולמי (מאגר נתונים, משתנה סביבתי, מנהל סודות). עדיפות על LicensePath.
Stream?LicenseStreamnullרישיון כ‑Stream, נקרא פעם אחת בהפעלה. עדיפות על שני המקורות האחרים.
boolResetLicensefalseדגל תאימות שמור. מימוש .NET 8 הנוכחי אינו משתמש בו; הפעל מחדש את היישום לאחר החלפת רישיון.
DoconutPluginRegistryPluginRegistryרישום קריאה בלבד שאוסף תרומות תוספים; נצרך על ידי מפעל הצופה. מלא באמצעות AddPlugin<T>().

עדיפות רישיון (מוכפפת ברישום השירות): LicenseStreamLicenseContentLicensePath → גילוי אוטומטי (ראה התחלה → הגדרת רישיון).

שיטות

AddPlugin()

text
DoconutOptions AddPlugin<TPlugin>() where TPlugin : IDoconutPlugin, new()

השתמש בשיטה זו עבור חבילות Converter ו‑DICOM המופעלות באופציית opt‑in. אנוטציה וחיפוש רגיל הם תכונות מורשות מובנות ואינן משתמשות ב‑AddPlugin<TPlugin>().

רושמת תוסף של צד ראשון (Converter, DICOM). Fluent — מחזירה את מופע האופציות. AddDoconut() זורק InvalidOperationException במקרה של רישיון חסר, קובץ TRIAL ישן, או רישיון בתשלום שאינו מעניק את היכולת לתוסף. רישומים זמניים/דמו נשמרים לאחר תפוגה והופכים לתלויים בשער זמן הריצה (ראה מושגים מרכזיים → מערכת תוספים).

ווידג׳ט ה‑Converter באופציית opt‑in מופעל באמצעות AddConverterWidget() ומוצג דרך המאפיין הקריאה‑בלבד ConverterWidget; אפשרויותיו מתועדות בעמוד תוספים → תוסף הממיר.

RegisterViewer(extension, factory, defaultConfig?)

text
DoconutOptions RegisterViewer(
    string extension,                    // ".myext" — leading dot optional
    Func<IFormatViewer> factory,
    Func<BaseConfig>? defaultConfig = null)

רושמת צופה מותאם עבור סיומת קובץ. צופים מותאמים מקבלים עדיפות על פני צופים מובנים ותוספים ואינם כפופים לרישיון. כאשר defaultConfig מושמט וקובץ נפתח ללא תצורה מפורשת, משתמשים ב‑ImageConfig.

זורק ArgumentException (Extension must be a non-empty file extension.) עבור סיומת ריקה ו‑ArgumentNullException עבור מפעל (factory) עם ערך null.

אימות בזמן אתחול

AddDoconut() מאמת את האופציות fail-fast, כך שמצב תצורה שגוי מתגלה כחריגה ברורה בזמן האתחול במקום 404 מבלבל בזמן הבקשה:

text
DoconutOptions.MiddlewarePath must be a non-empty path starting with '/'.
DoconutOptions.ResourcesPath must be a non-empty path starting with '/'.
DoconutOptions.MiddlewarePath and ResourcesPath must be different paths.

תצורות נפוצות

csharp
// Production: explicit license, everything locked down (all security defaults)
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = builder.Configuration["Doconut:License"] ?? "";
});

// Custom paths (e.g. to avoid a route conflict)
builder.Services.AddDoconut(options =>
{
    options.MiddlewarePath = "/docs-engine";
    options.ResourcesPath  = "/docs-assets";
});

כאשר אתה משנה את ResourcesPath, שמור את ResPath של הווידג׳ט של הלקוח מסונכרן (ראה ViewerConfig).

MiddlewarePath אינו ממפה אוטומטי של נתיבי ASP.NET Core. אם Doconut צריך לענות רק תחת קידומת מותאמת, הרכב UseDoconut() על אותו ענף (למשל עם app.Map("/docs-engine", branch => branch.UseDoconut())) והגדר את BasePath של הלקוח לאותו URL.

האם דף זה היה מועיל?