asp.net - नेटवर्क के बाहर बाहरी साइट से आंतरिक एमवीसी वेब एप को कैसे अनुमति दें




asp.net-mvc api (2)

मेरे पास MVC वेब API (IIS में होस्ट किया गया) है जो wwwroot फ़ोल्डर में है और नेटवर्क के भीतर स्थानीय रूप से सुलभ है। मैं इस तरह से एपीआई कॉल को निष्पादित कर सकता http://mylocalapi:133/api/Values/Get और मुझे एक परिणाम मिलता है। ।

मेरे पास एक बाहरी साइट है जो http://example.org और मैं उसी http://mylocalapi:133/api/Values/Get को निष्पादित करना चाहूंगा।

दोनों बाहरी सामना करने वाली साइट और साथ ही आंतरिक एपीआई साइट को एक ही सर्वर पर होस्ट किया जाता है (लेकिन यह अलग हो सकता है, उदाहरण के लिए नेटवर्क के बाहर एक 3 पार्टी विक्रेता)

मैंने अपने एपीआई में इस तरह स्थापित किया है:

[EnableCors(origins: "http://example.org", headers: "*", methods: "*")]

लेकिन मुझे निम्नलिखित त्रुटि मिलती रहती है:

XMLHttpRequest cannot load http://mylocalapi:133. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.org' is therefore not allowed access.

तो इसके चारों ओर जाओ, मैंने अपनी बाहरी साइट में एक वर्चुअल निर्देशिका ( APICALLS ) बनाई और एक web.config फ़ाइल बनाई जो स्थानीय IIS साइट को इंगित करेगी:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="http://mylocalapi:133" exactDestination="true" />
    </system.webServer>
</configuration>

जब मैं ऐसा करता हूं, तो मैं एपीआई को इस तरह एक्सेस करने की कोशिश करता हूं: http://example.org/APICALLS/api/Values/Get लेकिन मुझे निम्न त्रुटि मिलती है:

XMLHttpRequest cannot load http://mylocalapi:133. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.org' is therefore not allowed access.

मैं क्या गलत कर रहा हूं और मैं इस मुद्दे को कैसे हल कर सकता हूं।


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

प्रॉक्सी मूल रूप से एक एक्शन या क्रियाएं होगी जो बाहरी पहुंच प्रदान करती हैं, और फिर कॉल को अपने आंतरिक एपीआई में अनुवाद करती हैं। सरलतम रूप से, आपके पास एक एकल क्रिया हो सकती है जो मूल रूप से किसी चीज़ के प्रति प्रतिक्रिया करती है:

https://foo.com/api?endpoint=/internal/api/endpoint/&someParam=foo

तब यह कार्रवाई क्वेरी स्ट्रिंग में इस जानकारी को ले जाएगी और इसका उपयोग HttpClient जैसी किसी चीज़ के माध्यम से आपके आंतरिक API से अनुरोध करने के लिए HttpClient । हालाँकि, यह दृष्टिकोण आपके संपूर्ण आंतरिक API को बहुत अधिक उजागर करता है, इसलिए हो सकता है कि आप उस बिंदु पर इसे बाहर ले जाएं। बेहतर तरीका यह होगा कि आप विशिष्ट आंतरिक एपीआई कॉल के लिए विशिष्ट समापन बिंदु (एक्शन मेथड) बनाएं जो आपको जावास्क्रिप्ट के माध्यम से बनाने की आवश्यकता है।

अद्यतन करें

संदर्भ के बिना आपको यहां कोई वास्तविक दिशा देना मुश्किल है। मान लीजिए कि एक आंतरिक एपीआई समापन बिंदु है जो विगेट्स की एक सूची देता है और आप AJAX के माध्यम से विजेट की इस सूची को पुनः प्राप्त करना चाहते हैं। आपको कुछ इस तरह की आवश्यकता होगी:

public async Task<ActionResult> GetWidgets()
{
    // fetch widgets from internal API via HttpClient
    return Json(widgets, JsonRequestBehavior.AllowGet);
}

फिर, आपका AJAX आपकी वेबसाइट पर इस एक्शन विधि के लिए URL को कॉल करेगा, जिसके तहत हुड आंतरिक एपीआई को कॉल करता है।


रजिस्टर विधि में अपने WebApiConfig वर्ग में नीचे कोड जोड़ें

config.EnableCors();





cors