أفضل طريقة للتمييز بين وحدات تحكم MVC بناءً على رؤوس HTTP

StackOverflow https://stackoverflow.com/questions/78823

سؤال

مشكلة

يتطلب مشروعي الحالي مني القيام بأشياء مختلفة بناءً على رؤوس طلبات HTTP المختلفة لكل إجراء تقريبًا.

حاليًا، لدي وحدة تحكم ضخمة واحدة (جميعها لنفس نوع المورد)، وكل أسلوب إجراء له سمة ActionName (حتى أتمكن من الحصول على إصدارات متعددة من نفس الإجراء الذي يأخذ نفس المعلمات، ولكنه يفعل أشياء مختلفة) وتخصيصًا FilterAttribute (يتم تنفيذه تمامًا مثل AcceptVerbsAttribute في Preview 5) الذي يتحقق مما إذا كانت رؤوس معينة تحتوي على قيم معينة.

أرغب حقًا في دفع الكود إلى وحدات تحكم منفصلة، ​​وجعل RouteTable يختار بينها بناءً على الرؤوس، لكن لا يمكنني التفكير في الطريقة الأنظف للقيام بذلك.

مثال

على سبيل المثال، لنفترض أن لدي قائمة بالملفات.يجب أن تقوم الخدمة بمعالجة الطلب بإحدى الطريقتين التاليتين:

  1. يريد العميل ملفًا مضغوطًا، ويمرر "قبول:application/zip" كرأس، آخذ قائمة الملفات، وأحزمها في ملف مضغوط، وأرسلها مرة أخرى إلى العميل.

  2. يريد العميل صفحة html، لذلك يمرر "قبول:text/html"، يرسل الموقع صفحة html بتنسيق جدول تدرج الملفات.

هل كانت مفيدة؟

المحلول

يبدو أن لديك سلوكًا مختلفًا قليلاً عن أفعالك بناءً على العنوان الذي يأتي فيه.سأحاول عزل الاختلافات قدر الإمكان.

على سبيل المثال، إذا كان منطق التطبيق هو نفسه، ولكن الاختلاف الوحيد هو كيفية تقديم الاستجابة للمستخدم، فقد تفكر في كتابة ActionResult مخصص يأخذ إجراءات مختلفة بناءً على رؤوس Http.

ومع ذلك، إذا كان المنطق مختلفًا تمامًا، فيمكنك تطبيق قيد توجيه مخصص (IRoutConstraint) الذي تقوم بإرفاقه بكل مسار.ألق نظرة على تنفيذ HttpMethodConstraint للحصول على الأفكار.

نصائح أخرى

لست متأكدًا من أنك تحتاج إلى وحدات تحكم منفصلة بناءً على الرأس؛يبدو هذا الهيكل معقولًا تمامًا.إذا كانت وحدة التحكم الخاصة بك ضخمة كما تقول، ففكر فيما إذا كانت تتعامل مع موارد متعددة، وإذا كانت كذلك، فربما ينبغي تقسيمها إلى وحدات تحكم متعددة بناءً على المورد؟

لست متأكدًا مما إذا كان ذلك ممكنًا، ولكن يبدو أن هذا سيكون شيئًا مثل سمة AcceptVerbs التي كانت موجودة تمت إضافته في المعاينة 5.سألقي نظرة على كيفية تنفيذ ذلك (احصل على مصدر MVC) لمعرفة ما إذا كان بإمكانك إضافة شيء مشابه بناءً على نوع المحتوى.

يجب عليك أن تنظر هذا المشنور.وهو يصف تنفيذ استجابات json وxml بناءً على رأس http.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top