6

मेरे पास एक एएसपी.नेट वेब एपीआई प्रोजेक्ट है। प्रतिबिंब का उपयोग करके, मैं नीचे दिए गए उदाहरण में एचटीपी क्रिया ([HttpGet]) कैसे प्राप्त कर सकता हूं) विशेषता जो मेरी क्रिया विधियों को सजाती है?मुझे रीएक्शन का उपयोग करके एक क्रिया के http क्रिया गुण कैसे प्राप्त करें - एएसपी.नेट वेब एपीआई

[HttpGet] 
public ActionResult Index(int id) { ... } 

मान लें कि मेरे पास मेरे नियंत्रक में उपर्युक्त क्रिया विधि है। अब तक, प्रतिबिंब का उपयोग करके मैं Index कार्रवाई विधि है जो मैं एक चर बुलाया में जमा हो जाती है की एक MethodInfo वस्तु प्राप्त करने के लिए सक्षम किया गया है methodInfo

मैं निम्नलिखित का उपयोग कर http क्रिया पाने की कोशिश की, लेकिन यह काम नहीं किया - रिटर्न अशक्त:

var httpVerb = methodInfo.GetCustomAttributes(typeof (AcceptVerbsAttribute), false).Cast<AcceptVerbsAttribute>().SingleOrDefault(); 

कुछ मैंने देखा है:

मेरे उदाहरण के ऊपर एक ASP.NET वेब API प्रोजेक्ट मैं पर काम कर रहा हूँ से है।

ऐसा लगता है कि [HttpGet] एक System.Web.Http.HttpGetAttribute

लेकिन नियमित में ASP.NET MVC परियोजनाओं [HttpGet] है एक System.Web.Mvc.HttpGetAttribute

उत्तर

4
var methodInfo = MethodBase.GetCurrentMethod(); 
var attribute = methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute), true).Cast<ActionMethodSelectorAttribute>().FirstOrDefault(); 

आप थे बहुत करीब ...

अंतर यह है कि सभी 'क्रिया' से विरासत गुण है 'ActionMethodSelectorAttribute' मैं 'AcceptVerbsAttribute' विशेषता को छोड़कर।

+0

धन्यवाद @Elie, तथापि, अपने समाधान केवल एक ASP.NET MVC आवेदन के लिए काम करता है लेकिन एक ASP.NET वेब API अनुप्रयोग के लिए नहीं।एक वेब एपीआई प्रोजेक्ट में http क्रिया - HttpGet, एक एमवीसी प्रोजेक्ट में HttpGet से अलग है। – cda01

2

मुझे बस इसकी आवश्यकता है और चूंकि वेब एपी विशेषताओं के लिए वास्तविक आवश्यकता को संबोधित करने का कोई जवाब नहीं है, इसलिए मैंने अपना जवाब पोस्ट कर दिया है।

  • System.Web.Http.HttpGetAttribute
  • System.Web.Http.HttpPutAttribute
  • System.Web.Http.HttpPostAttribute
  • System.Web:

    वेब एपीआई गुण इस प्रकार हैं .Http.HttpDeleteAttribute

उनके एमवीसी समकक्षों के विपरीत, वे मूल विशेषता प्रकार से प्राप्त नहीं होते हैं, लेकिन उत्तराधिकारी सीधे सिस्टम से। एट्रिब्यूट। इसलिए आपको व्यक्तिगत रूप से प्रत्येक विशिष्ट प्रकार के लिए मैन्युअल रूप से जांचना होगा।

मैं एक छोटे से विस्तार विधि कि इतने तरह MethodInfo वर्ग फैली कर दिया है:

public static IEnumerable<Attribute> GetWebApiMethodAttributes(this MethodInfo methodInfo) 
    { 
     return methodInfo.GetCustomAttributes().Where(attr => 
      attr.GetType() == typeof(HttpGetAttribute) 
      || attr.GetType() == typeof(HttpPutAttribute) 
      || attr.GetType() == typeof(HttpPostAttribute) 
      || attr.GetType() == typeof(HttpDeleteAttribute) 
      ).AsEnumerable(); 
    } 

एक बार जब आप प्रतिबिंब द्वारा अपने नियंत्रक कार्रवाई विधि के लिए MethodInfo वस्तु, ऊपर विस्तार विधि आप मिल जाएगा बुला मिल गया है कार्रवाई विधि के सभी कि विधि पर वर्तमान में जिम्मेदार बताते हैं:

var webApiMethodAttributes = methodInfo.GetWebApiMethodAttributes(); 
+0

क्या आपने सोचा है: 'methodInfo.GetCustomAttributes()। जहां (attr => attr IActionHttpMethodProvider है)' – Trevor

संबंधित मुद्दे