2016-03-10 9 views
10

युक्त मौजूदा परियोजना नियंत्रकों है कि या तो से विरासत है:ApiController और कार्रवाई का नाम से URL प्राप्त, एक परियोजना में नियंत्रकों और ApiControllers

  • Controller: "{controller}/{action}/{id}" साथ RouteTable.Routes.MapRoute
  • ApiController: GlobalConfiguration.Configure और कॉलबैक MapRoute"api/{controller}/{id}" के साथ।

सबकुछ ठीक काम करता है, लेकिन मुझे इन दोनों प्रकार के नियंत्रकों में क्रिया विधियों के लिए यूआरएल उत्पन्न करने की आवश्यकता है। यह देखते हुए:

  1. एक नाम या एक नियंत्रक है कि इन दोनों में से किसी से विरासत के प्रकार, और
  2. एक कार्रवाई विधि नाम
वेब साइट की ओर से

फिर, मैं कैसे के लिए उचित यूआरएल उत्पन्न कर सकते हैं वेब एपीआई पक्ष?

मैं अभी कार्रवाई और नियंत्रक नाम प्राप्त करने के लिए प्रतिबिंब का उपयोग कर रहा हूं, और फिर UrlHelper.Action(actionName, controllerName, routeValueDictionary) का उपयोग करके वेब साइट मार्गों के लिए सही यूआरएल प्राप्त कर रहा हूं।

हालांकि, यह विधि (निश्चित रूप से) वेबएपीआई पक्ष के लिए इस तरह के यूआरएल उत्पन्न करती है: /ApiControllerName/Get?parameter1=value जब इसे /api/ApiControllerName?parameter1=value होने की आवश्यकता होती है और यह अलग ज्ञान है कि यह एक अनुरोध है।

उद्देश्य: यह वेब साइट के लिए धूम्रपान परीक्षण पृष्ठ के लिए है जो परीक्षण का धुआं तय करने के लिए विशेषताओं और प्रतिबिंब का उपयोग करता है। पूरे प्रोजेक्ट में एक ही विशेषता का उपयोग करने में सक्षम होना अच्छा होगा, और इसके अलावा यह सही UrlHelper का उपयोग करने में सक्षम होना बहुत अच्छा होगा जो रूटिंग टेबल से अवगत है और सही उपसर्ग जैसे /api/ का उत्पादन कर सकता है कोड मानते हुए, शायद गलत तरीके से, कि एपीआई मार्ग api के साथ पंजीकृत थे और नहीं, webapi कहें।

अद्यतन

निरंतर अनुसंधान के बाद मैं the Url.HttpRouteUrl method जो वेबएपीआई यूआरएल उत्पन्न कर सकते हैं पाया है, लेकिन यह एक मार्ग का नाम, नहीं एक कार्रवाई विधि नाम जानने की आवश्यकता है।

मैंने इस पर और भी अधिक शोध किया है और समाधान के करीब नहीं मिला है। ऐसा लगता है कि आप उपयुक्त मार्ग का मार्ग नाम, you can cook up a Url easily जानते हैं। कुछ संभावित संकेत भी हैं here और here। लेकिन यदि वेबएपी के लिए कई मार्ग हैं, तो आप कैसे जानते हैं कि कौन सा नियंत्रक और कार्यवाही से मेल खाता है? एक नियंत्रक और कार्रवाई का चयन करने में एमवीसी पहले से ही क्या करता है, यह पुन: कार्यान्वित करने के लिए गूंगा होगा। मुझे लगता है कि मैं प्रत्येक वेबएपी मार्ग का उपयोग करके दिए गए पैरामीटर से एक यूआरएल बना सकता हूं, फिर यूआरएल को अपने पैसों के माध्यम से चलाएं (उपर्युक्त लिंक में से कुछ का उपयोग करके) और देखें कि क्या यह वांछित नियंत्रक से मेल खाता है ... yuck।

एक आसान तरीका होना चाहिए।

अभी के लिए मुझे आगे बढ़ना होगा, लेकिन उम्मीद है कि कोई मेरी मदद कर सकता है।

उत्तर

5

यहाँ के कुछ तरीके यह करना:

  • RouteUrl() पद्धति का उपयोग करना:

    var url1 = Url.RouteUrl(new { id = 1, controller = "...", httproute = true }); 
    

चाल पाठ्यक्रम httproute = true की है। इस संपत्ति को सेट करते हुए, आप सूचित करते हैं कि आप केवल http मार्ग (वेब ​​एपी मार्ग) चाहते हैं।

var url2 = Url.HttpRouteUrl(null, new { id = 2, controller = ".." }); 
  • और एक और तरीका सीधे मार्गों और httproute मूल्य का उपयोग कर यह करने के लिए:

    • HttpRouteUrl() पद्धति का उपयोग करना

      var values = new RouteValueDictionary(new 
      { 
          id = 3, 
          controller = "...", 
          httproute = true 
      }); 
      var url3 = RouteTable.Routes.GetVirtualPath(Request.RequestContext, values).VirtualPath; 
      

    3 तरीके मूल रूप से एक ही हैं । चूंकि आप मार्ग निर्दिष्ट नहीं करते हैं, इसलिए सिस्टम मार्ग मानों के अनुसार पहला मैच ढूंढने का प्रयास करेगा। उदाहरण के लिए, की सुविधा देता है कि आप एक ApiController बुलाया RestfulController और वेब एपीआई मार्गों तो तरह कॉन्फ़िगर किए गए हैं:

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

    पहली विधि का उपयोग करना, जब आप एक MVCController में var url = Url.RouteUrl(new { id = 123, controller = "restful", httproute = true }); करते हैं, url में मूल्य /api/restful/123 है।

    लेकिन आप एक नया मार्ग ConstraintApi जोड़ते हैं:

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

    यूआरएल RouteUrl द्वारा दिया /api2/restful/123 है।

    जब आप अपने मार्ग घोषित कर रहे हैं तो आपको आदेश पता होना चाहिए। यदि मार्ग DefaultApi मार्ग ConstraintApi से पहले जोड़ा गया है, तो उत्पन्न यूआरएल /api/restful/123 है।

  • +0

    यह थोड़ा स्पष्टीकरण के साथ काम करता है। 'httproute = false' के लिए, किसी को 'UriHelper.Action' का उपयोग करना होगा और क्रिया विधि नाम को पैरामीटर के रूप में पास करना होगा, इसे' रूटवेल्यूलेक्शन 'में नहीं डालना चाहिए। साथ ही, वेबएपी में, HTTP क्रिया को सही तरीके से समझने के बारे में कुछ मज़ेदारता है, लेकिन अभी के लिए मैं संतुष्ट हूं ('action =" get "या 'action =" methodName "में गुजर रहा है" केवल एक क्वेरीस्ट्रिंग मान प्रोजेक्ट करता है)। – ErikE

    3

    Hyprlinkr लाइब्रेरी है जो आपको रूट कॉन्फ़िगरेशन का उपयोग कर नियंत्रक और क्रिया से यूआरआई बनाने की अनुमति देती है।

    +0

    यह दिलचस्प लग रहा है और मुझे जो चाहिए वह हो सकता है, लेकिन इस बीच यह मेरे लिए बॉक्स के बाहर तैयार नहीं है क्योंकि "एएसपी द्वारा प्रदान की गई 'HttpRequestMessage' क्लास' के उदाहरण की आवश्यकता है। प्रत्येक अनुरोध के लिए नेट वेब एपीआई। इस उदाहरण को प्राप्त करने का पसंदीदा तरीका कस्टम 'IHttpControllerActivator' को लागू करना और वहां से रूटलिंकर उदाहरण बनाना है। " इसका मतलब है कि मुझे वेब पक्ष में काम करने के लिए कुछ चालाक करना होगा (जो निश्चित रूप से 'HttpRequestMessage' का उदाहरण नहीं है)। – ErikE

    0

    यह एक हैक की तरह लगता है, लेकिन यदि आप केवल परीक्षण के लिए इसका उपयोग करने की योजना बना रहे हैं तो कोशिश करने लायक है। जैसा कि आपने बताया है, आप रूट नाम के साथ एक यूआरएल उत्पन्न कर सकते हैं। तो आप सभी मार्ग नामों को पकड़ सकते हैं और सभी संभावित यूआरएल उत्पन्न कर सकते हैं। फिर आपको यह जांचने की आवश्यकता है कि यूआरएल आपको जिस क्रिया की आवश्यकता है या नहीं। इसके लिए आप निम्न की तरह कुछ उपयोग कर सकते हैं: https://stackoverflow.com/a/19382567/1410281। मूल विचार यह है कि यदि आपके पास एक यूआरएल है, तो वहां नकली रीडायरेक्ट करें, और फ्रेमवर्क से रूटिंग डेटा प्राप्त करें।

    +0

    यह एक दिलचस्प विचार है। पैरामीटर कैसे इसमें खेलेंगे-यानी, जब पैरामीटर सूची द्वारा केवल क्रिया विधियों में भिन्नता होती है, तो मैं वांछित क्रिया विधि को हिट करने वाला URL कैसे विश्वसनीय रूप से उत्पन्न करूं? इसके अलावा, क्या होगा यदि रूट नाम के बिना मार्ग स्थापित किए गए थे? – ErikE

    +0

    जैसा कि मैंने कहा था कि यह एक पूर्ण समाधान नहीं बल्कि एक हैक है।तो पैरामीटर काम करेंगे जहां तक ​​आप प्रतिबिंब के साथ जा सकते हैं और यह संभवतः केवल उन मामलों के लिए काम करेगा जो आपको चाहिए। (आपने अपने अपडेट में उल्लेख किया है कि यदि आपके पास मार्ग का नाम है तो यूआरएल उत्पन्न करना संभव है, इसलिए मैंने बस यह माना कि आप इसे हल कर सकते हैं) – Tamas

    +0

    मार्गों के नामों के लिए, आप अपना 'रूट' और 'रूट चयन नहीं कर सकते 'वर्ग, जिसमें मार्ग का नाम होता है, या जब इससे कुछ भी निर्दिष्ट नहीं किया जाता है, जिसे आप संदर्भित कर सकते हैं। – Tamas

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