الترحيل
Doconut.NETFramework 26.8.0 (.NET Framework 4.7) to 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. مقارنة تطبيقك بالعينة التي بدأ منها هو أسرع مسار.
حزمة واحدة، إصداران
كلا المكتبتين تُنشران تحت نفس معرف الحزمة، Doconut.NETFramework. الإصدار يميزهما:
| الإصدار | الهدف | واجهة برمجة التطبيقات |
|---|---|---|
| 26.8.0 وما قبلها | .NET Framework 4.7 | واجهة برمجة التطبيقات السابقة |
| 26.9.0 وما بعده | .NET Framework 4.7.2 | واجهة برمجة التطبيقات الجديدة |
تحديث الحزمة هو الترقية. لا توجد حزمة منفصلة للتثبيت ولا طبقة توافق: 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
الحزمة الكلاسيكية كانت تبني عارضها لكل طلب، مع خيارات كخصائص لتلك الحالة. الحزمة الجديدة لديها جذر تركيبي، يُبنى مرة واحدة في Application_Start، والعارض هو خدمة تقوم بحلّها:
// قبل - Doconut.NETFramework 26.8.0 وما قبله، حسب الطلب
var viewer = new Viewer
{
ID = "ctlDoc",
IncludeJQuery = true,
BasePath = "/",
FitType = "width"
};// 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 (انظر ViewerConfig). لا يزال new Viewer() يُترجم بمجرد تشغيل DoconutHost.Initialize، لذا يمكن لكود الخلفية المُهجر الاحتفاظ بهذا السطر أثناء نقل الإعدادات.
الأمان يعمل كما كان. فتح مستند يمنح جلسة ASP.NET الحالية الوصول إلى صفحاته، وDocImage.axd يرفض الجميع. إعداد التطبيق DoconutUnSafeMode الذي كان يعطل ذلك أصبح الآن options.UnsafeMode في DoconutHost.Initialize — اتركه false. راجع الجلسات والأمان.
فشل بدء التشغيل الذي يُسقِط الموقع بالكامل. إضافة مسجّلة لا تمنحها أي ترخيص للقدرة تُلقي استثناءً في
Application_Start، ثم يرد التطبيق بـ500فارغ لكل طلب — لا صفحة خطأ، لا شيء في سجل IIS، فقط إدخال في سجل أحداث Windows (المصدر ASP.NET). تُقرأ التراخيص منwwwrootتحت جذر الموقع ولا في أي مكان آخر، ويجب أن يكون الـDoconut.Viewer.licالأساسي موجودًا وإلا لن تُقرأ تراخيص الإضافة المجاورة له. راجع إعداد الترخيص.
4. مزرعة الويب: من علامة إلى الوضع الموزع
النموذج الكلاسيكي كان viewer.IsWebfarm = true بالإضافة إلى ExportToPng(path). النموذج الجديد يُسجل مرة واحدة: كل عقدة تشارك مخزنًا واحدًا ومفتاح توقيع واحد، وتستبدل تذكرة موقعة مرتبطة بالمتصفح عبارة "أي عقدة تجيب":
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 بايت، نفس القيمة على كل عقدة
}));بعد ذلك افتح المستندات كالمعتاد، مع ربط المتصفح (DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(...)) وتسليم viewer.AccessToken إلى الواجهة مع الرمز. الجلسات والأمان يحتوي على الخطوات؛ عينة مزرعة الويب هي عقدة كاملة. لا يزال IsWebfarm و WebfarmPath يترجمان، لكنهما لم يعودا يفعّلان أي شيء.
شيئان يبدوان كنجاح ولكنهما ليسا كذلك: DistributedDocumentPublisher.PublishAsync يكتب ملفات المستند المصدرة لكنه لا يفتح جلسة، لذا يحصل المشاهد الموجه إلى رمز منشور على صورة خطأ بحجم ~2 كيلوبايت مع الحالة 200؛ وعميل اختبار بدون ملف تعريف الارتباط doconut-client يحصل على نفس الصورة، وليس 401. يمكنك التمييز بين صفحة حقيقية وصورة الخطأ حسب الحجم.
5. التحويل هو ملحق، وهو أصغر بكثير
التعداد SourceFormatConverter، والاثني عشر فئة *ConfigConverter، وتعداداتهم المستهدفة المتداخلة تُستبدل بتعداد واحد، ConversionTarget، واستدعاء واحد:
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);تنسيق المصدر يأتي من الامتداد الذي تمرره. لا يوجد طبقة توافق: كل إشارة إلى SourceFormatConverter هي خطأ تجميع تحلّه بحذفها. كائنات الخيارات لكل تنسيق لم تبقَ — لا يوجد ما يعادل WordConfigConverter.HtmlOptions و CadConfigConverter.CadOptions.ShowColor عبر ConvertAsync. في نماذج الويب، لا تحظر أبداً على ConvertAsync — انظر ملحق التحويل.
6. التخزين السحابي: الوصول إليه كمجلد مشترك
أنواع تكوين السحابة انتقلت إلى Doconut.Clouds دون تغيير. ومع ذلك، معالجات طلبات السحابة هي مكونات ASP.NET Core، ولا يحتوي تطبيق كلاسيكي على خط أنابيب لتشغيلها. من موقع 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() { } (التعليقات) | دون تغيير — وظائف أحداث التعليق لا تزال عامة، تُعثر عليها بالاسم |
ثلاثة أخرى: المشاهد لا يرسم شريط أدواته الخاص (صفحتك توصل Zoom، Next، GotoPage والبقية إلى أزراره الخاصة); المشاهد الذي يُنشأ داخل نافذة Bootstrap مخفية يقيّم 0×0 ولا يرسم شيئًا حتى تعطي حاويته ارتفاعًا صريحًا وتعيد ضبطه على shown.bs.modal؛ وAllowSearch يفرض القيمة الافتراضية false لملف PDF، لذا يُعرض المستند بشكل مثالي بينما كل بحث لا يُعيد أي نتيجة.
8. ما يختفي
| مفقود | بدلاً من |
|---|---|
DocumentSearch / TextSearch.cs | لا شيء — البحث يعمل على النص الذي تستخرجه عارضات الصيغ |
Viewer.WatermarkInfo | لا مكافئ |
WordConfigConverter.HtmlOptions | لا توجد كائنات خيارات عبر ConvertAsync |
SourceFormatConverter، الفئات *ConfigConverter | ConversionTarget و ConvertAsync |
Doconut.Configs.Editor | تم إزالته |
viewer.IsWebfarm + ExportToPng(path) | AddDoconutDistributed و الفتح العادي |
ترتيب العمل المقترح
- أعد التوجيه، استبدل الحزمة، واحصل على تجميع
Global.asaxمعDoconutHost.InitializeوتسجيلينWeb.config. يجب أن يبدأ الموقع. - صفحة عارض واحدة: احصل على مستند للعرض، ثم اعمل عبر القسم 7 حتى تعمل شريط الأدوات والبحث والتعليقات التوضيحية. تحقق في متصفح حقيقي — لا شيء في ذلك القسم يسبب خطأ.
- التحويل (القسم 5): ميكانيكي، ومعظم أخطاء التجميع.
- الصفحات المتبقية، باستخدام العينات المنقولة كهدف للفرق.
- مزرعة الويب (القسم 4)، إذا كان لديك واحدة. اختبر باستخدام عقدتين ومتصفح، أو عميل يحتفظ بملفات تعريف الارتباط.
هل كانت هذه الصفحة مفيدة؟