2015-03-30 4 views
11

मेरे पास WebApi 2.2 का उपयोग कर सी # में चल रही एक .NET प्रोजेक्ट है।विशेषता मार्ग टेम्पलेट्स की एक सूची प्राप्त करें asp.net webapi 2.2

मैं विशेषता का उपयोग कर अपने सभी मार्गों को पंजीकृत कर रहा हूं। मैं क्या करना चाहता हूं समर्थक स्ट्रिंग के रूप में सभी विशेषता मार्ग टेम्पलेट्स को व्याकरणिक रूप से पुनर्प्राप्त करता है।

कुछ की तरह: var routeTemplates = System.Web.Routing.RouteTable.Routes.Select(x => x.RouteTemplates);

मैं जब मैं ControllerContext.Configuration.Routes

हालांकि पर नजर डाल मार्गों के सभी देखने के लिए सक्षम हूँ, मैं के रूप में वे रक्षा की आंतरिक रहे हैं मेरे कोड से मार्गों का उपयोग नहीं कर पा रहे । मैं उन पर कैसे पहुंच सकता हूं?

मैंने एक स्क्रीन शॉट संलग्न किया है जो मेरे locals watch पर देखे गए मूल्यों को दिखाता है जिन्हें मुझे प्राप्त करने की आवश्यकता है।

The data I want to get at

+0

स्पष्ट रूप से स्टैक ओवरफ्लो आपको पूर्ण आकार की छवियों को देखने नहीं देता है। तो यह यहां अपलोड किया गया है: http://imgur.com/DFlMqDa –

उत्तर

10

जब वेब एपीआई में विशेषता मार्गों दर्ज की है आप कैसे विशेषता मार्गों पाए जाते हैं अनुकूलित करने के लिए एक कस्टम IDirectRouteProvider रजिस्टर कर सकते हैं। उस कस्टम IDirectRouteProvider में आप सभी "हार्ड" काम को डिफ़ॉल्ट कार्यान्वयन, DefaultDirectRouteProvider पर प्रतिनिधि कर सकते हैं, जो विशेषता नियंत्रकों की सूची की गणना करने के लिए सभी नियंत्रकों और कार्यों को देखता है, और फिर उन सभी कड़ी मेहनत के लिए क्रेडिट लेता है।

यह सब सेट करने के लिए, पहले एक नया "नमूदार" सीधा रास्ता प्रदाता है कि प्रतिनिधियों को अपने सभी काम बनाने के लिए:

public class ObservableDirectRouteProvider : IDirectRouteProvider 
{ 
    public IReadOnlyList<RouteEntry> DirectRoutes { get; private set; } 

    public IReadOnlyList<RouteEntry> GetDirectRoutes(HttpControllerDescriptor controllerDescriptor, IReadOnlyList<HttpActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver) 
    { 
     var realDirectRouteProvider = new DefaultDirectRouteProvider(); 
     var directRoutes = realDirectRouteProvider.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver); 
     // Store the routes in a property so that they can be retrieved later 
     DirectRoutes = DirectRoutes?.Union(directRoutes).ToList() ?? directRoutes; 
     return directRoutes; 
    } 
} 

और फिर अपने ऐप के स्टार्टअप में WebApiConfig.Register विधि से इस नए वर्ग का उपयोग करें:

public static class WebApiConfig 
{ 
    public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider(); 

    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

ध्यान दें कि डेटा अंततः एक स्थिर क्षेत्र में संग्रहीत किया जाता है। यह आवश्यक है क्योंकि WebApiConfig.Register के अंदर कोड तुरंत नहीं कहा जाता है - इसे बाद में global.asax.cs में कहा जाता है। तो, सब कुछ के परिणामों का निरीक्षण करने, Application_Start करने के लिए कुछ कोड जोड़ें:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    var allDirectRoutes = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes; 
    // now do something with 'allDirectRoutes' 
} 

और एक छोटे से परीक्षण मैंने लिखा है, मैं ये मान मिला:

enter image description here

और वहाँ तुम्हारे पास है, ऐप में सभी विशेषता मार्गों की एक सूची!

नोट: यदि आप यह जानना चाहते हैं कि प्रत्येक विशेषता मार्ग कहां से आया है, तो DataTokens प्रत्येक मार्ग की संपत्ति में अतिरिक्त डेटा squirrelled है।

+0

धन्यवाद! मैं इसके साथ खेलूँगा, लेकिन जाने का सही तरीका लगता है। –

+0

मुझे बक्षीस देने के लिए 23 घंटे का इंतजार करना है। –

+0

यह भी पाया गया कि यह https://github.com/Daniel15/RouteJs/blob/master/src/RouteJs/RouteCollectionUtils.cs –

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