2012-03-04 15 views
7

क्या मेरे पास HTML को वापस करने वाले एएसपी.नेट एमवीसी अनुरोधों और जेएसओएन को वापस करने वाले एएसपी.नेट वेब एपीआई के लिए एक ही यूआरएल हो सकता है?क्या एएसपी.नेट वेब एपीआई एमवीसी के समान यूआरएल पर काम कर सकता है?

मैं इस तरह के उदाहरणों में मार्गों देखें: "api/{id}" लेकिन मैं बहुत MVC (नहीं जाल एपीआई) में इस api/ हिस्सा और उपयोग इस पते से छुटकारा पाने के कर सकते हैं?

एक तरफ यह संभव होना चाहिए क्योंकि हमारे पास सामग्री बातचीत है। लेकिन इस तरह मुझे एक ही पते के साथ दो मार्गों की आवश्यकता है, इसलिए यह समझ में नहीं आता है, है ना?

दूसरे शब्दों में: क्या मेरे पास Controller और ApiController समान यूआरएल के साथ हो सकता है? या मुझे HTML के लिए ApiController का भी उपयोग करना चाहिए?

उत्तर

5

जैसा कि पिछले उत्तर में बताया गया है कि आप ऐसा कोई काम नहीं कर सकते हैं और मैं वास्तव में यह नहीं देख सकता कि आप ऐसा कुछ क्यों करना चाहते हैं।

लेकिन मैं इस बात से सहमत नहीं हूं कि अगर आप एक स्वच्छ एपीआई चाहते हैं तो आपको एक ही परियोजना में एक चीज़ के साथ रहना चाहिए, तो मैं वेबपी के लिए जाऊंगा और एमवीसी का उपयोग अपने पृष्ठों को होस्ट करने के लिए करूंगा, और उस समय मेरे पास एक अलग फ़ोल्डर में एपीआई एक अलग मार्ग के तहत।

+0

बिल्कुल, उन्हें अलग परियोजनाएं रखें – RickAndMSFT

+2

@ रिक। एंडर्सन-at-Microsoft.com, मैं नहीं कहता कि आपको उन्हें अलग-अलग परियोजनाओं में रखना चाहिए, जो एपीआई और साइट के आकार पर निर्भर करता है। यदि यह एक छोटा सा एप्लीकेशन है, तो मुझे लगता है कि आपके पास एक ही प्रोजेक्ट में एपीआई और साइट दोनों हो सकते हैं और अगर संभव हो तो एपीआई को क्षेत्र में अलग करके अलग कर दें। –

1

नहीं, आपके पास दो अलग-अलग वर्गों के लिए एक ही यूआरएल मार्ग नहीं हो सकता है। यदि एक से अधिक मार्ग आने वाले अनुरोध से मेल खाते हैं, तो मेल खाने वाला पहला उपयोग किया जाएगा।

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

1

पिछले उत्तरों ने स्थिति की व्याख्या की है। जोड़ने के लिए एक बात यह है कि, एएसपी.नेट एमवीसी या वेब एपीआई, आपके सभी मार्ग एक ही सूची के तहत एकत्र किए जाते हैं।

उदाहरण के लिए, डिफ़ॉल्ट प्रोजेक्ट टेम्पलेट पर, यदि आप वेब एपीआई से पहले एएसपी.नेट एमवीसी रूट पंजीकृत करते हैं, तो आप देखेंगे कि /api पथ के तहत अनुरोध एएसपी.नेट एमवीसी मार्ग द्वारा उठाए गए हैं।

0

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

यदि आपका यूआरएल बिल्कुल वही है, यहां तक ​​कि क्वेरीस्ट्रिंग तक भी, तो नहीं। तुम अभागे हो।

1

सिद्धांत रूप में, आप वेब एपीआई का उपयोग करें और एक सामग्री प्रदाता है कि एचटीएमएल (उस्तरा से संभव हो) वापस आ जाएगी निर्माण कर सकते हैं जब ग्राहक पाठ का अनुरोध करता है \ एचटीएमएल और json जब ग्राहक का अनुरोध करता है आवेदन \ json

3

मैं खेल रहा जा सकता है शैतान यहां वकील हैं, लेकिन मैं इस बिंदु को देख सकता हूं कि कोई ऐसा कुछ क्यों करना चाहेगा।

अक्सर एक ही यूआरएल पर एक एपीआई का एक HTML प्रतिनिधित्व होना अच्छा लगता है। यह दृष्टिकोण उपयोगकर्ताओं को ब्राउज़र के भीतर से एपीआई के चारों ओर क्लिक करने और एक्सप्लोर करने की अनुमति देता है।

मुझे एक कस्टम संदेश हैंडलर का उपयोग करके वेबएपीआई में इसके आसपास मिल गया है जो 302 एक एमवीसी मार्ग पर रीडायरेक्ट करता है।एक हैक हो सकता है की

public class HtmlMessageHandler : DelegatingHandler 
{ 
    private List<string> contentTypes = new List<string> { "text/html", "application/html", "application/xhtml+xml" }; 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Method == HttpMethod.Get && request.Headers.Accept.Any(h => contentTypes.Contains(h.ToString()))) 
     { 
      HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Redirect); 

      var htmlUri = new Uri(String.Format("{0}/html",request.RequestUri.AbsoluteUri)); 

      response.Headers.Location = htmlUri; 

      return Task.Factory.StartNew<HttpResponseMessage>(()=> response); 
     } 
     else 
     { 
      return base.SendAsync(request, cancellationToken); 
     } 
    } 
} 

बिट लेकिन यह करता है काम और मैं व्यक्तिगत रूप से लगता है कि यह एक कस्टम HTML MediaTypeFormatter (जो मैं भी करने की कोशिश की) की तुलना में अधिक;)

+0

दिलचस्प विचार। क्या आप एक पूर्ण नमूना लिख ​​सकते हैं और इसे पोस्ट कर सकते हैं? – RickAndMSFT

+0

मैंने गिटहब पर एक पूर्ण नमूना लगाया है। https://github.com/arble/WebApiContrib.MessageHandlers.Html –

+0

@OliverPicton पृष्ठ मेरे लिए नहीं मिला? क्या यह अभी भी सक्रिय है? – Qpirate

2

वेबएपीआई आप को लागू करने से कस्टम मार्ग की कमी को परिभाषित करने की अनुमति देता है System.Web.Http.Routing.IHttpRouteConstraint

नियमित एएसपी.नेट एमवीसी में आप System.Web.Routing.IRouteConstraint लागू करके ऐसा कर सकते हैं।

इस तरह, आप ऐसे मार्ग बना सकते हैं जो केवल एक निश्चित HTTP स्वीकृति शीर्षलेख के लिए सक्रिय हैं। "एप्लिकेशन/जेसन" या "टेक्स्ट/एचटीएमएल"।

+0

पर एकमात्र उत्तर है - सही जगह पर – Bond