12

मुझे एएसपी.नेट वेब एपीआई में रूटिंग बेस क्लास में मामूली अंतर मिला है जिसने मुझे थोड़ा सहायक वर्ग लिखने के लिए मजबूर किया है जो मुझे मेरे मार्गों को परिभाषित करने की अनुमति देगा सिर्फ एक बार। क्या इसका कोई कारण है? मैं यह सोचते हैं रहा हूँ यह बहुत बड़ी ढांचे में कोई परिवर्तन दोनों RouteCollection रों एक ही आधार वर्ग से निकाले जाते हैं कर सकते हैं या एक ही इंटरफ़ेस (जो इस वर्ग के बहुत सरल बना सकता था)एएसपी.नेट वेब एपी रूटिंग (आईआईएस बनाम स्वयं होस्टेड) ​​

public static class RouteMapper 
{ 
    private class Route 
    { 
     public string Name { get; set; } 
     public string Template { get; set; } 
     public object Defaults { get; set; } 

     public Route(string name, string template, object defaults) 
     { 
      Name = name; 
      Template = template; 
      Defaults = defaults; 
     } 
    } 

    private static List<Route> GetRoutes() 
    { 
     return new List<Route> 
        { 
         new Route(
          "API Default", 
          "api/{controller}/{id}", 
          new {id = RouteParameter.Optional}) 
        }; 
    } 

    public static void AddHttpRoutes(this HttpRouteCollection routeCollection) 
    { 
     var routes = GetRoutes(); 
     routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults)); 
    } 

    public static void AddHttpRoutes(this RouteCollection routeCollection) 
    { 
     var routes = GetRoutes(); 
     routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults));    
    } 
} 

लागू करने के लिए था क्या यह मेरे लिए अनुमति देता है करने के लिए मेरे Global.asax और मेरे एकीकरण परीक्षण दोनों में एक सरल AddHttpRoutes विधि को कॉल करना है।

एकता टेस्ट

 var configuration = new HttpSelfHostConfiguration("http://localhost:20000"); 
     configuration.Routes.AddHttpRoutes(); 

     _server = new HttpSelfHostServer(configuration); 
     _server.OpenAsync().Wait(); 

Global.asax

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.AddHttpRoutes(); 

     routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

यह एक ज्ञात समस्या है और यह ASP.NET वेब एपीआई के बाद के रिलीज में तय होने की संभावना है?

+0

ग्रेट उदाहरण कोड, मैंने मूल रूटिंग Config.cs फ़ाइल के अंदर सभी रूटिंग कोड रखने के लिए इसे थोड़ा संशोधित किया। – angularsen

उत्तर

4

हां, इस तथ्य के कारण रूटिंग थोड़ा अलग है कि एएसपी.नेट पहले ही रूटिंग कर रहा है लेकिन हम सीधे उस पर निर्भर नहीं हो सकते क्योंकि इससे स्वयं-होस्ट समर्थन को रोका जा सकेगा। हम अभी भी देख रहे हैं कि चीजें और अधिक समझ कैसे सकती हैं।

+0

मुझे लगता है कि अगर वे दोनों एक आम इंटरफेस को लागू करने के लिए बदल गए थे तो एक विस्तार विधि का उपयोग किया जा सकता था और रूटिंग केवल एक ही स्थान पर करने की आवश्यकता होगी। मैंने जो किया है उसके समान लेकिन केवल एक विस्तार विधि की आवश्यकता है। मुझे यकीन है कि आप उससे कहीं ज्यादा चालाक होंगे :) –

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