9

द्वारा की खोज नहीं ASP.NET वेब API सहायता पृष्ठ का उपयोग करते समय और संबंधित MVC.ApiExplorer मैं वैध मार्गों कि http के माध्यम से सुलभ हैं अभी तक ApiExplorer द्वारा की खोज नहीं कर रहे हैं। ये मार्ग केवल तभी पाए जाते हैं जब एक सामान्य रूटिंग नियम का उपयोग किया जाता है। एक और विशिष्ट नियम (सामान्य के साथ संयोजन में) का उपयोग ApiExplorer से मार्ग छिपाने लगता है।मान्य मार्गों MVC.ApiExplorer

तीन नियमों का एक उदाहरण मामला दो मार्गों किसी GET और एक नियंत्रक विधि है जो कोई क्वेरी पैरामीटर पर ध्यान पर एक पोस्ट कार्रवाई से संबंधित में जाना एमआईए। एपीआई/SomeController

  • मिलती है:: एपीआई/SomeController
  • public class SomeControllerController : ApiController 
    { 
        [HttpPost] public HttpResponseMessage Post(PostObject value) { ... } 
        [HttpGet] public IEnumerable<DisplayObject> GetAll() { ... } 
        [HttpGet] public DisplayObject GetById(string id) { ... } 
    } 
    

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

    मार्गों में से एक रूटिंग नियम का उपयोग करते समय के रूप में

    • पोस्ट एपीआई एक्सप्लोरर द्वारा उचित रूप से खोज कर रहे हैं
    • प्राप्त: एपीआई/SomeController/{आईडी}

    अभी तक जब भी कम सामान्य और अधिक सार्थक नियम जोड़ने

    routes.MapHttpRoute(
        name: "ApiSomeControllerDefault", 
        routeTemplate: "api/somecontroller/{id}", 
        defaults: new 
           { 
           controller = "SomeController", 
           id = RouteParameter.Optional 
           } 
        ); 
    
    routes.MapHttpRoute(
        name: "ApiDefault", 
        routeTemplate: "api/{controller}/{id}", 
        defaults: new 
           { 
            id = RouteParameter.Optional 
           } 
        ); 
    

    एपीआई एक्सप्लोरर केवल रिटर्न

    • प्राप्त: एपीआई/somecontroller/{आईडी}

    क्या खड़ी कर रहा है मेरे कुछ मार्ग नहीं मिलेगा?

    संपादित Link to Issue Report on ApiExplorer project page

    उत्तर

    5

    मेरा मानना ​​है कि आप क्या देख रहे हैं ApiExplorer के साथ एक ज्ञात बग है। क्या हो रहा है कि ApiExplorer यदि नियंत्रक और उसके कार्यों को हल किया जा सकता माध्यम से चला जाता मार्ग संग्रह और चेक में प्रत्येक मार्ग है।

    इस मामले में, उदाहरण के लिए, उपरोक्त दोनों मार्गों द्वारा "GetById" क्रिया का पता लगाया जा सकता है, जो ApiExplorer संदिग्ध मिलान के कारण गलत तरीके से संघर्ष कर रहा है और यह डुप्लिकेट क्रियाओं को फ़िल्टर करने का प्रयास करता है, जिसमें यह मामला सभी कार्यों को फ़िल्टर/हटाया जा रहा है। चूंकि यह बग ApiExplorer (जो मुख्य वेबएपीआई कोर का हिस्सा है) में है, मुझे डर है कि हम इसे जल्द ही ठीक नहीं कर सकते हैं।

    +0

    मैंने अभी "एपीडीफॉल्ट" नियम को हटाने और "एपीसोम कंट्रोलर डीफॉल्ट" नियम को छोड़ने के लिए सत्यापित किया है, वास्तव में एपीएक्सप्लोरर को एक बार छुपा मार्ग उपलब्ध कराता है। – rheone

    +0

    आपने एपीडीफॉल्ट नियम को कैसे हटाया? – user3654055

    5

    इस बग ASP.NET वेब API टीम द्वारा तय नहीं है, मैं अपने ही गूंगा ठीक उपयोग कर रहा हूँ।

    IApiExplorer के लिए मेरा विस्तार विधि ApiExplorer कक्षा में मूल ApiDescriptions कार्यान्वयन के रूप में ही बातें कर रही है, लेकिन इसके बजाय अलग-अलग मार्गों के लिए डुप्लिकेट कार्यों को हटाने की, यह सिर्फ अलग आईडी (HTTP विधि + मार्ग) के साथ कार्रवाई देता है। तो मार्गों की गणना के बावजूद, यह सभी घोषित कार्यों को वापस कर देता है।

    और, हाँ, यह बेशर्म प्रतिबिंब निजी विधि कॉल करने का उपयोग करता है।

    public static class WebApiExtensions 
    { 
        public static Collection<ApiDescription> GetAllApiDescriptions(this IApiExplorer apiExplorer, HttpConfiguration httpConfig) 
        { 
         if (!(apiExplorer is ApiExplorer)) 
         { 
          return apiExplorer.ApiDescriptions; 
         } 
    
         IList<ApiDescription> apiDescriptions = new Collection<ApiDescription>(); 
         var controllerSelector = httpConfig.Services.GetHttpControllerSelector(); 
         var controllerMappings = controllerSelector.GetControllerMapping(); 
    
         if (controllerMappings != null) 
         { 
          foreach (var route in httpConfig.Routes) 
          { 
           typeof(ApiExplorer).GetMethod("ExploreRouteControllers", 
            bindingAttr: BindingFlags.Instance | BindingFlags.NonPublic, 
            binder: null, 
            types: new[] {typeof(IDictionary<string, HttpControllerDescriptor>), typeof(IHttpRoute), typeof(Collection<ApiDescription>)}, 
            modifiers: null 
           ).Invoke(apiExplorer, new object[] {controllerMappings, route, apiDescriptions}); 
          } 
    
          apiDescriptions = apiDescriptions 
           .GroupBy(api => api.ID.ToLower()) 
           .Select(g => g.First()) 
           .ToList(); 
         } 
    
         return new Collection<ApiDescription>(apiDescriptions); 
        } 
    } 
    

    यह उपयोग करने के लिए आसान है:

    var apiDescriptions = apiExplorer.GetAllApiDescriptions(httpConfig); 
    

    HttpConfiguration पैरामीटर testability के लिए जोड़ा गया। यदि आपको इसकी परवाह नहीं है, तो पैरामीटर को हटाएं और सीधे विस्तार विधि में GlobalConfiguration.HttpConfiguration का उपयोग करें।

    +0

    आपको बहुत बहुत धन्यवाद। फ्रेमवर्क के साथ इतनी लड़ाई के बाद इस जवाब ने मेरी समस्या हल की !!! –

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