ASP.NET Core / دليل حلول تحريري

تشخيص الحالات 404 و 405 وإخفاقات الربط والتحقق

تتبّع اختيار نقطة النهاية وطريقة HTTP ومصدر المدخلات وتحقق الإطار وسلوك الإجراء قبل إضافة مسارات بديلة واسعة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

قد يتلقى الطلب 404 رغم وجود إجراء، أو 405 لمسار مألوف، أو 400 أو 415 قبل بلوغ نقطة التوقف داخل المعالج. وقد ينجح استدعاء المتحكم مباشرة بينما يفشل الطلب العام. قد تنشأ هذه النتائج في مراحل مختلفة: التوجيه أو اختيار الطريقة أو نوع المحتوى أو الربط أو التحقق التلقائي. لا يحدد اختبار وحدة ناجح المرحلة التي بلغها العميل فعلًا.

افهم الأسباب المحتملة

  • قد يغيب تعيين نقطة النهاية، أو تختلف قيود المسار أو أسماء معاملاته، أو تُستخدم طريقة HTTP خاطئة، أو يقرأ الربط مصدرًا غير المتوقع. يعتمد تحقق MVC مع ApiController وتحقق Minimal APIs على إعداد كل منهما. قد تخفي نقطة نهاية شاملة catch-all هذا التعارض بدل إصلاحه، كما أن وجود إجراء داخلي لا يجعله تلقائيًا إجراءً عامًا في متحكم يكتشفه الإطار.

1. احفظ الطريقة والمسار وتمثيل المدخلات بدقة

سجّل طريقة الطلب الاصطناعي ومساره المرمّز ومفاتيح الاستعلام ونوع المحتوى وبنية الجسم ونقطة النهاية المتوقعة. قارنها بالتعيين الفعلي وبأي مجموعة مسارات أو بادئة. تجنب تغيير طبقات عدة في الوقت نفسه. وميّز صحة صياغة معرّف المسار من وجود الكيان المطلوب ومن سماح النظام للمستدعي بالوصول إليه.

2. افصل بنية المسار من اختيار الطريقة والقيود

لا تثبت مطابقة قالب المسار وحدها قرار توجيه كاملًا؛ إذ تظل بيانات طريقة HTTP والقيود والأسبقية ومجموعة نقاط النهاية مؤثرة. يستخدم البرنامج المكتمل TemplateMatcher لمسار اصطناعي واحد، ثم يقارن الطريقة بصورة منفصلة. إنه فحص لمكوّن من عملية التشخيص، وليس اختبارًا لاستجابة 405 من مضيف أو لعملية الربط، ولا يرسل أي حركة طلبات.

csharp فحص بنية المسار وقاعدة مستقلة لطريقة الطلب
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Template;

var matcher = new TemplateMatcher(TemplateParser.Parse("reports/{id}"), new RouteValueDictionary());
var values = new RouteValueDictionary();
bool pathMatch = matcher.TryMatch(new PathString("/reports/7"), values);
string method = HttpMethods.Post;
bool methodAllowed = HttpMethods.IsGet(method);
Console.WriteLine($"pathMatch={pathMatch} id={values["id"]} methodAllowed={methodAllowed}");
الناتج المتوقع
pathMatch=True id=7 methodAllowed=False

تطابق بنية المسار القيمة 7، لكن POST الاصطناعية لا تحقق قاعدة GET هذه؛ ولا ينفذ المثال موجّهًا كاملًا أو استجابة HTTP.

3. راجع مصدر الربط المعلن وتمثيل البيانات

قارن مصادر المسار والاستعلام والترويسات والجسم والخدمات بتوقيع المعالج والسمات الصريحة عليه. ميّز المدخل المفقود من المشوّه، ونوع المحتوى غير المدعوم، والقيمة التي نجح تحليلها لكنها خارج مجال التطبيق. لا يصح افتراض استنتاج جسم GET ضمنيًا كما قد يحدث مع POST. ولا تعالج اختلاف المصدر بقبول مدخلات اعتباطية من كل موضع؛ بل حدّد عقدًا عامًا واحدًا.

4. حدّد هل يجري تحقق الإطار قبل استدعاء الإجراء

قد ترفض آلية ApiController حالة ModelState غير الصالحة قبل تنفيذ إجراء المتحكم، بينما تملك Minimal APIs إعداد تحقق ومرشحات مرتبطين بالإصدار المستخدم. يتجاوز استدعاء الإجراء مباشرة هذين المسارين. افحص تفاصيل خطأ آمنة والسلوك المضبوط، وافصل التحقق من بنية DTO عن قواعد ملكية المجال أو التفرد وفق الحالة الراهنة أو سير العمل. لا تكشف أجسام الاستثناءات الخام أثناء التشخيص.

5. أصلح واجهة نقطة النهاية المقصودة واختبرها

أصلح التسجيل أو المسار أو الطريقة أو مصدر المدخلات أو قاعدة التحقق المحددة التي تراجعها. اختبر الطلب الصحيح والطريقة الخاطئة والمسار غير المعيّن والمدخل المشوّه والكيان الغائب والمستخدم غير المصادق ورفض التفويض. حافظ على اتساق بيانات النتيجة الوصفية والروابط المولدة. قد تجعل نقطة بديلة واسعة تعيد 200 العرض يختفي، لكنها تكسر عقد الحالات العام وقابلية رصد المشكلة.

تحقق من نجاح الإصلاح

يجب أن يطبع البرنامج المحلي pathMatch=True id=7 methodAllowed=False. تحقّق من عقد الطريقة والمسار والحالة العامة بعد الإصلاح باختبار تكامل إطار معزول ومعتمد عند توافره. يجب أن يشمل الاختبار الربط الفعلي والتحقق التلقائي والمصادقة والتفويض وتنفيذ النتيجة إذا أردت تقديم ادعاءات عن تلك الطبقات. يظل اختبار القالب أو الإجراء مباشرة دليلًا ضيقًا مفيدًا، لا إثباتًا لسلامة API كاملة.

امنع تكرار المشكلة

  • احتفظ بجدول يربط المسار والطريقة والمدخلات والحالة، واجعل الربط صريحًا حيث يهم إزالة اللبس، وافصل اختبارات الوحدة والمكوّن والتكامل. راجع تغير المسارات وأسماء المعاملات كتغييرات توافق. احفظ الحالات الاصطناعية المضادة، ولا تُخفِ التعيينات المكسورة بمسارات شاملة أو بإضعاف التحقق.

المراجع الرسمية