فشل تصدير SSRS عبر بوابة VPN بلا عميل: ما الذي يختلف
صفحة التقرير تثبت العرض لا التصدير. تابع طلب التصدير عبر البوابة، وقارن الترويسات والنص، ثم حدّد أي استثناء بدقة.
يُفتح التقرير في المتصفح، وتُعرض المعلمات، ويُنتج زر التصدير خطأً أو تنزيلاً فارغاً أو ملفاً يرفض الجدول فتحه. هذا المزيج له شكل قياسي. صفحة تقرير عاملة تكون قد اختبرت العرض والمصادقة ولا شيء غيرهما. التصدير طلب منفصل باستجابته الخاصة، وعبر بوابة بلا عميل يمر أيضاً بطبقة إعادة كتابة لم تُصمم يوماً لتنزيل الملفات.
مساران، وصفحة واحدة عاملة
العرض والتصدير عمليتان مختلفتان حتى عندما يبدآن من الزر نفسه. يعرض خادم التقارير الصفحة للمتصفح، ويُصدر التصدير عبر ملحق إخراج آخر بنوع محتوى خاص به وسلوك أخطاء خاص به، على النحو الذي تصفه وثائق التصدير . البوابة التي تمرر الأول ببراعة قد تشوّه الثاني رغم ذلك، لأن الثاني استجابة لم تتوقع البوابة رؤيتها. الاثنان يتشاركان جلسة وعنواناً، ولا يكادان يتشاركان شيئاً آخر.
تعامل مع الصفحة العاملة كدليل على المصادقة وإمكانية الوصول فقط. إنها تثبت أن الحساب يستطيع الوصول إلى خادم التقارير وأن البوابة تمرر HTML. ولا تقول شيئاً عن استجابات الملفات أو ترويسات موضع المحتوى أو إعادة التوجيه التي تنتهي بتنزيل بدلاً من مستند.
هذا هو السبب الكامل لمقارنة مسار التصدير بمعزل عن غيره بدلاً من إعادة اختبار الصفحة العاملة أصلاً. طلبان يتشاركان جلسة واحدة يظلان طلبين.
ثلاثة شروط تحدد أين ينكسر التصدير
ثلاثة أسئلة تحدد موضع الخلل بسرعة، وكل إجابة تشير إلى مالك مختلف.
أولاً، هل يُصدَّر التقرير نفسه والحساب نفسه والتنسيق نفسه بشكل صحيح من الشبكة الداخلية؟ إن كان كذلك، فخادم التقارير ومحرك العرض سليمان والفرق في مسار الوصول. ثانياً، هل تحمل الاستجابة الفاشلة نوع محتوى ملف، أم صفحة HTML ترتدي امتداد ملف؟ ذلك يفصل خطأ محرك العرض عن استبدال من البوابة. ثالثاً، هل تعيد البوابة كتابة عنوان URL للطلب أو تزيل ترويسات من الاستجابة؟ قد يهبط عنوان URL معاد كتابته على نقطة نهاية مختلفة تماماً.
أجب عن الأسئلة الثلاثة قبل تغيير أي إعداد، لأن لكل منها علاجاً مختلفاً. خطأ محرك العرض يخص خادم التقارير، والنص المستبدل يخص البوابة، والترويسة المنتزعة مسألة سياسة لا خلل.
اكتب الإجابات. حالة دعم مبنية على تلك الأسطر الثلاثة تساوي عشر لقطات شاشة.
اقرأ استجابة التصدير بدلاً من رمز الحالة
رمز نجاح HTTP يثبت فقط أن شيئاً ما أجاب عن الطلب. افحص النص والترويسات معاً، لأن الفشل المثير هو استجابة ناجحة تحمل محتوى خاطئاً.
curl -sS -D export.headers -o export.bin --location "https://portal.example.com/reports/export?format=xlsx"
file export.bin
head -c 300 export.bin
يعرض تفريغ الترويسات نوع المحتوى وأي موضع محتوى أعادته البوابة. يحدد الأمر file ماهية النص فعلاً، والملف النصي حيث يُتوقع جدول بيانات هو صفحة تسجيل الدخول المستبدلة الكلاسيكية. يعرض الأمر head ما يكفي للتعرف على HTML دون إفراغ تقرير كامل في طرفية.
احجب ملفات تعريف ارتباط الجلسة والرموز قبل مشاركة أي منها. التقاط تصدير عامل دليل مفيد، والتقاط جلسة تخص شخصاً آخر حادث أمني.
اجعل الاستثناء محصوراً في التطبيق، لا في الحساب
إذا كانت البوابة تعيد كتابة الاستجابة أو تحجبها، فإن الإصلاح المغرر هو استثناء الموقع بأكمله أو جعل التقرير مجهولاً. كلاهما يصلح التنزيل ويزيل سبب وجود البوابة. الاستثناء المحصور يسمي مسار تطبيق واحداً ونوع محتوى واحداً واتجاهاً واحداً، ويظل قابلاً للمراجعة من قبل من يملك السياسة.
استخدم إصدار البوابة الذي تشغله فعلاً وإعدادات التطبيق الموثقة الخاصة به. الخيار الذي وصفه مورّد مرة بأنه يترك المرور دون تغيير ليس تعليمة عامة، ونسخه من موضوع منتدى قديم هو الطريق لتحويل استثناء مؤقت إلى بنية دائمة.
إذا تعذر حصر الاستثناء بتلك الدقة، فمن المرجح أن التصدير ينتمي إلى المسار الداخلي بأسلوب وصول مختلف بدلاً من خلف البوابة. إعفاء الموقع بأكمله قرار لمالك البوابة، لا حل مؤقت لتقرير واحد.
اقبل التصدير، لا مربع حوار الحفظ
الفحص الأخير هو الملف نفسه: يُفتح، ويحمل الأعمدة المتوقعة، وتطابق مجاميعه التقرير الذي وافق عليه المستخدم.
ظهور مربع حوار حفظ ليس نجاحاً، والملف الذي يُفتح مع تحذير إصلاح ليس نجاحاً أيضاً. قارن عدد الصفوف وقيمة معروفة واحدة بالتقرير المعروض على الشاشة، لأن تصديراً مقتطعاً ينجح في كل اختبار ينظر إلى حجم الملف فقط. ثم صدّر مرة ثانية، لأن طبقة تخزين مؤقت تقدم النص الخاطئ مرة قد تقدم الصحيح في المحاولة التالية.
اقبل سير العمل الذي احتاجه المستخدم، ولا أقل من ذلك. التنزيل الذي يُفتح في التطبيق الخطأ يظل تصديراً فاشلاً.