English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在上篇文章中我们分析了Asp.Net路由系统,今天我们再来简要分析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是如何实现的。我们仍然从一个简单示例开始。
创建一个空的WebApi项目,在Global中注册路由信息:
public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { //register route GlobalConfiguration.Configuration.Routes.MapHttpRoute( name: "default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); } }
أنشئت Controller تحت اسم Home:
public class HomeController : ApiController { // GET: api/Home public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET: api/Home/5 public string Get(int id) { return "value"; } }
الآن، بعد تشغيل التطبيق، في شريط العناوين في المتصفح، نكتب http://localhost:46351/api/home و http://localhost:46351/api/home/5، النتيجة كما يلي:
لقد نظرنا بسرعة في مثال Asp.Net Web API، سنبدأ الآن بتحليل نظام مسارات Asp.Net Web API.
دعونا نبدأ بالنظر في طريقة تسجيل المسار في Asp.Net Web API، كما يلي:
في عملية تسجيل المسار هذه، ما هي العمليات المخفية؟ سنجد في المصدر التالي:
من خلال النظر في المصدر يمكن رؤية أن تسجيل مسار Asp.Net Web API يتم في الواقع من خلال استدعاء طريقة التوسيع MapHttpRoute من نوع HttpRouteCollection، وفي طريقة MapHttpRoute، نرى أن يتم حفظ الجسم المسار المكتسب من خلال استدعاء طريقة Add من قبل HttpRouteCollection. وبما أن الخاصية الثابتة GlobalConfiguration من نوع HostedHttpRouteCollection يتم إنشاؤها باستخدام Configuration كمعامل بناء من RouteTable.Routes، وبما أن نوع HostedHttpRouteCollection هو فرع من نوع HttpRouteCollection، في نوع HostedHttpRouteCollection، يتم تعديل طريقة Add من قبل فرع HostedHttpRouteCollection من الطريقة الأم من CreateRoute، كما هو موضح في الشكل التالي، لذا، فإن نوع الجسم المسار المكتسب في الواقع هو HostedHttpRoute، هذا الجسم المسار يتم وضعها في جدول مسارات العالمية لحفظها، من هنا يمكننا معرفة أن نوع الجسم المسار المحفوظ في جدول مسارات العالمية هو HostedHttpRoute. إذاً، لماذا يتم حفظ الجسم المسار المسجل في جدول مسارات العالمية؟ سيتم تحليل الجزء التالي.
من خلال النظر في الكود المصدر، يمكننا رؤية أن النوع الأخير للمستوى هو HostedHttpRoute، لذا الآن لدينا سؤال، عند تسجيل الطريق في الماضي، لم نحدد مانيح معالجة الطلبات ومانيح معالجة الطلبات، من أين يتم إضافتهما إلى عناصر الطريق؟ ما هي الأسرار المخفية في عملية إنشاء مانيح HostedHttpRoute؟ سنستمر في النظر في الكود المصدر فيما بعد:
من خلال التحليل السابق، حتى الآن، يمكننا معرفة أن في Asp.Net Web API عند استضافة البرنامج بشكل WebHost، العناصر المسجلة هي نماذج من نوع HostedHttpRoute، مخزنة في قائمة الطرق العالمية RouteTable.Routes، وأن مانيح معالجة الطلبات هو مانيح من نوع HttpControllerRouteHandler ومانيح معالجة الطلبات هو مانيح من نوع HttpControllerHandler.
بعد تسجيل معلومات الطريق، كيف يتم استخدام معلومات الطريق المسجلة في Asp.Net Web API لتحقيق التوجيه؟ هل سيتم تحقيق ذلك أيضًا من خلال HttpModule مثل ASP.Net؟ لنبدأ في تشغيل البرنامج ونرى خاصية Modules في فئة Global:
من خلال الصورة السابقة يمكننا رؤية بوضوح، عند استضافة خدمة Asp.Net Web API بشكل WebHost، فهي تتمثل في نفس طريقة ASP.Net، من خلال UrlRoutingModule لتحقيق التوجيه. من خلال تحليل المقال السابق المتعلق بنظام توجيه Asp.Net، يمكننا معرفة أن Asp.Net يحقق التوجيه من خلال拦截 الطلبات باستخدام UrlRoutingModule، ثم يقوم بالتفاوت في قائمة الطرق العالمية لمعرفة البيانات التي تتطابق مع عنوان الطلبUrl لإجراء معالجة لاحقة. في Asp.Net Web API، من خلال النص السابق، نعرف أن العناصر المخزنة في قائمة الطرق العالمية هي نوع HostedHttpRoute، وسنستمر في تحليل كيفية الحصول على البيانات التي تتطابق مع RouteData في Asp.Net Web API.
في UrlRoutingModule، يتم الحصول على RouteData بشكل متسلسل عن طريق استدعاء طريقة GetRouteData لكل من عناصر الطريق. في Asp.Net Web API، نظرًا لأن نوع عناصر الطريق هو HostedHttpRoute، لنلق نظرة ما يحدث عند استدعاء طريقة GetRouteData:
يمكن رؤية أن في HostedHttpRoute يتم الحصول على RouteData من خلال طريقة GetRouteData من السمة OriginalRoute، ومن خلال التحليل السابق، نعلم أن السمة OriginalRoute هي نوع HttpWebRoute:
من خلال التحليل السابق، يمكننا رؤية أن Asp.Net Web API عند توزيعه بطريقة WebHost، في النهاية يتم إكمال عملية مطابقة المسار من خلال نظام التوجيه Asp.Net. ولكن يجب الانتباه إلى أن، نظرًا لعملية إعادة كتابة طريقة التحقق من التقييد في HttpWebRoute، فإن Asp.Net Web API يستخدم طريقة خاصة الخاصة به للتحقق من مطابقة التقييد عند التحقق من التقييد:
في النهاية، بعد الحصول على RouteData والمحتويات الموجودة فيها مثل RouteHandler وHttpHandler، يمكن لـ Asp.Net Web API التعامل مع الطلبات وإرسال الإجابات من خلال هذه البيانات.
الخلاصة:
من خلال تحليل المقال السابق، يمكننا استنتاج: عند توزيع Asp.Net Web API بطريقة WebHost، يتم حفظ المسارات المسجلة في جدول المسارات العالمية؛ عند الحصول على RouteData، يتم مطابقة المسار من خلال قواعد مطابقة نظام التوجيه Asp.Net، ولكن تم تنفيذ قواعد التحقق الخاصة به.
هذا هو نهاية محتويات هذا المقال، نأمل أن تكون قد ساعدتكم في التعلم، ونأمل أيضًا أن تدعموا وتؤازروا تعليماتي.
البيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المحتويات مملوكة للمالك الأصلي، المحتويات مقدمة من المستخدمين عبر الإنترنت، ويحمل الموقع حقوق الملكية، لم يتم تعديل المحتويات بشكل إنساني، ولا يتحمل الموقع أي مسؤولية قانونية مرتبطة بذلك. إذا اكتشفتم محتويات تتضمن حقوق النسخ، يرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وتقديم الدليل، وإذا تم التحقق من ذلك، سيتم حذف المحتويات المزعجة فورًا.