c# अलग परियोजना में एमवीसी समाधान में वेब एपीआई




asp.net-mvc asp.net-mvc-4 (7)

मैंने हाल ही में लगभग एक ही काम किया है: मैंने वीएस2012 में वेब एपीआई टेम्पलेट चुनने वाली एक नई एमवीसी 4 वेब एप्लिकेशन प्रोजेक्ट के साथ शुरुआत की।

यह एमवीसी के समान एप्लिकेशन में होस्ट की गई एक वेब एपीआई तैयार करेगा।

मैं एपीकंट्रोलर को एक अलग वर्ग लाइब्रेरी प्रोजेक्ट में ले जाना चाहता था। यह काफी आसान था लेकिन समाधान थोड़ा छिपा था।

एमवीसी 4 प्रोजेक्ट के AssemblyInfo.cs में कोड की समान पंक्ति जोड़ें

[assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")]

अब आपको क्लास लाइब्रेरी रजिस्ट्रेटर की आवश्यकता है (इसे नाम देने के लिए स्वतंत्र महसूस करें)

public class LibraryRegistrator
    {
        public static void Register()
        {
            BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll")));
        }
    }

एमवीसी 4 प्रोजेक्ट में एपी लाइब्रेरी का संदर्भ भी शामिल है।

अब आप एपीआई नियंत्रकों को अपनी अलग कक्षा पुस्तकालय (yourown.dll) में जोड़ सकते हैं।

मैं एक नई एमवीसी 4 प्रोजेक्ट तैयार कर रहा हूं, और शोध ने मुझे विश्वास दिलाया है कि जावास्क्रिप्ट से सर्वर पक्ष में संचार करना अब नियंत्रक कार्यों के बजाय वेब एपीआई ढांचे के माध्यम से बेहतर है। क्या मेरी समझ इस पर सही है?

मुझे लगता है कि मैं अपने सभी विशेषताओं को वेब एपीआई और एमवीसी नियंत्रकों के बीच साझा कर सकता हूं ताकि चेहरे पर, यह मेरे लिए भारी परिवर्तन नहीं लग रहा है।

जब मैं एप्लिकेशन स्थापित कर रहा हूं, तो मैं घटकों को परियोजनाओं में विभाजित करना चाहता हूं। मेरी योजना एक एमवीसी परियोजना और एक वेब एपीआई परियोजना थी। लेकिन मैं मुद्दों पर भाग गया है। उदाहरण के लिए, मैंने 2 ऐप्स के साथ समाप्त किया है, अलग-अलग रूटिंग सेट इत्यादि।

तो मेरा सवाल यह है कि, एक एमवीसी अनुप्रयोग में वेब एपीआई ढांचा एक ही प्रोजेक्ट के भीतर बैठना चाहिए, या क्या वेब एपीआई को अपनी परियोजना में अलग किया जाना चाहिए और मुद्दों के आसपास काम करना चाहिए?


आईएमओ, सुरक्षा और तैनाती आपके निर्णय को ड्राइव करना चाहिए। उदाहरण के लिए, यदि आपका एमवीसी ऐप फॉर्म प्रमाणीकरण का उपयोग करता है लेकिन आप अपने एपीआई के लिए मूल प्रमाणीकरण (एसएसएल के साथ) का उपयोग करने में रुचि रखते हैं, तो अलग-अलग परियोजनाएं आपके जीवन को आसान बनाने जा रही हैं। यदि आप www.example.com पर साइट होस्ट करना चाहते हैं लेकिन api.example.com (बनाम www.example.com/api) के रूप में अपनी एपीआई होस्ट करें, अलग-अलग परियोजनाएं आपके जीवन को आसान बनाती हैं। यदि आप अपनी परियोजनाओं को अलग करते हैं और उन्हें तदनुसार सबडोमेन करते हैं और आप अपने एमवीसी ऐप से अपने स्वयं के एपीआई का लाभ उठाने का इरादा रखते हैं, तो आपको अपने एपीआई में क्लाइंट-साइड कॉल के लिए समान मूल नीति समस्या से निपटने का तरीका पता लगाना होगा। इसके लिए सामान्य समाधान jsonp या CORS (अधिमानतः यदि आप कर सकते हैं) का लाभ उठाने के लिए हैं।

अद्यतन (3/26/2013): आधिकारिक सीओआरएस समर्थन आ रहा है: http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API


कुछ डिग्री अनुभव के बाद (ऐप्स के लिए एपीआई और एमवीसी के लिए)। मैं ज्यादातर दोनों करते हैं।

मैं एपीआई कॉल के लिए एक अलग प्रोजेक्ट बनाता हूं जो अन्य क्लाइंट या अन्य डिवाइस (एंड्रॉइड / आईओएस ऐप) से आता है। कारणों में से एक कारण है क्योंकि प्रमाणीकरण अलग है, यह टोकन आधारित है (इसे स्टेटलेस रखने के लिए)। मैं इसे अपने एमवीसी अनुप्रयोग में मिश्रण नहीं करना चाहता हूं।

मेरे जावास्क्रिप्ट / jquery api के लिए मेरे एमवीसी एप्लिकेशन पर कॉल करने के लिए, मुझे चीजों को सरल रखना पसंद है इसलिए मैं अपने एमवीसी अनुप्रयोग के अंदर एक वेब एपीआई शामिल करता हूं। मैं अपने जावास्क्रिप्ट एपीआई कॉल के साथ टोकन आधारित प्रमाणीकरण का इरादा नहीं रखता, क्योंकि हे, यह एक ही एप्लीकेशन में है। मैं एपीआई एंडपॉइंट पर केवल [authorize] विशेषता का उपयोग कर सकता हूं, जब कोई उपयोगकर्ता लॉग इन नहीं होता है, तो उसे डेटा नहीं मिलेगा।

इसके अलावा, शॉपिंग कार्ट से निपटने के दौरान और आप एक सत्र में उपयोगकर्ताओं को शॉपिंग कार्ट स्टोर करना चाहते हैं (लॉग इन नहीं होने पर), आपको अपने एपीआई में यह भी होना चाहिए यदि आप अपने जावास्क्रिप्ट कोड के माध्यम से उत्पादों को जोड़ / हटाते हैं। यह आपके एपीआई को निश्चित रूप से बयान देगा, लेकिन आपके एमवीसी-एपीआई में जटिलता को भी कम करेगा।


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

मैं एक "प्रेजेंटेशन लेयर" में system.web नेमस्पेस को अलग रखना चाहता हूं। Webapi प्रस्तुति नहीं होने के बावजूद यह अभी भी आपके आवेदन के इंटरफ़ेस का हिस्सा है। जब तक आप अपने डोमेन में तर्क रखते हैं, न कि आपके नियंत्रक आपको बहुत सारी समस्याओं में भाग नहीं लेना चाहिए। इसके अलावा, क्षेत्रों का उपयोग करना न भूलें।



दुर्भाग्यवश आप इसके बारे में गलत हैं - मुझे लगता है कि मैं अपने सभी विशेषताओं को वेब एपीआई और एमवीसी नियंत्रकों के बीच साझा कर सकता हूं ताकि चेहरे पर, यह मेरे लिए भारी परिवर्तन नहीं लग रहा है।

वेब एपीआई और एमवीसी द्वारा उपयोग की जाने वाली कई अवधारणाएं, भले ही पहली नज़र में समान हों, वास्तव में संगत नहीं हैं। उदाहरण के लिए, वेब एपीआई विशेषताओं System.Web.Http.Filters.Filter और MVC विशेषताएँ System.Web.Mvc.Filter - और वे एक दूसरे के लिए परिवर्तनीय नहीं हैं।

कई अन्य अवधारणाओं पर भी लागू होता है - मॉडल बाइंडिंग (पूरी तरह से अलग तंत्र), मार्ग (वेब ​​एपीआई HTTP रूट्स रूट्स का उपयोग नहीं करता है, भले ही वे दोनों एक ही अंतर्निहित रूटटेबल पर काम करते हैं), निर्भरता रिज़ॉल्वर (संगत नहीं) और अधिक - भले ही समान सतह, अभ्यास में बहुत अलग हैं। इसके अलावा, वेब एपीआई में क्षेत्रों की अवधारणा नहीं है।

आखिरकार, यदि आप जो कुछ हासिल करने की कोशिश कर रहे हैं, वह JSON सामग्री की सेवा करने का "नया, आधुनिक" तरीका है - उस पथ पर जाने से पहले दो बार सोचें। मैं निश्चित रूप से किसी मौजूदा कोड को पुन: सक्रिय करने की अनुशंसा नहीं करता जबतक कि आप वास्तव में HTTP को गले लगाने और अपने ऐप को एक शानदार तरीके से बनाने में नहीं लग रहे हैं।

यह सब वास्तव में निर्भर करता है कि आप क्या बना रहे हैं। यदि आप एक नई परियोजना शुरू कर रहे हैं, और आपको बस अपने वेब ऐप को सुविधाजनक बनाने के लिए कुछ JSON की सेवा करना है - बशर्ते आप कुछ संभावित डुप्लिकेट कोड (जैसे ऊपर उल्लिखित सामग्री) के साथ रहने के इच्छुक हैं, वेब एपीआई आसानी से होस्ट किया जा सकता है एएसपी.नेट एमवीसी के समान परियोजना।

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


Web.Api के लिए अलग DLL सेट करने के अलावा।

केवल एक सलाह:

  1. परियोजना बनाएं
  2. Nugget WebActivatorEx
  3. App_start पर कॉल करने के लिए ए क्लास विधि बनाएं

    [असेंबली: WebActivatorEx.PostApplicationStartMethod (टाइपऑफ (API.AppWebActivator), "प्रारंभ करें")]

    [असेंबली: WebActivatorEx.AplicationShutdownMethod (टाइपऑफ (API.AppWebActivator), "शटडाउन")]

  4. प्रारंभ विधि के अंदर एक वेब.एपीआई मार्ग पंजीकृत करें

    सार्वजनिक स्थैतिक शून्य प्रारंभ () {ग्लोबल कॉन्फ़िगरेशन। कॉन्फ़िगर (WebApiConfig.Register); }

  5. परियोजना को वेब परियोजना में संदर्भित करें। प्रारंभ विधि को सक्रिय करने के लिए।

उम्मीद है की यह मदद करेगा।





asp.net-web-api