Microsoft वेब एपीआई: आप एक Server.MapPath कैसे करते हैं?


239

चूंकि Microsoft वेब API MVC नहीं है , इसलिए आप ऐसा कुछ नहीं कर सकते:

var a = Request.MapPath("~");

न यह

var b = Server.MapPath("~");

क्योंकि ये System.Webनामस्थान के अंतर्गत हैं, नामस्थान नहीं System.Web.Http

तो आप वेब एपीआई में रिश्तेदार सर्वर पथ का पता कैसे लगाते हैं ?
मैं MVC में ऐसा कुछ करता था :

var myFile = Request.MapPath("~/Content/pics/" + filename);

जो मुझे डिस्क पर पूर्ण पथ देगा:

"C:\inetpub\wwwroot\myWebFolder\Content\pics\mypic.jpg"

जवाबों:


469

आप किसी भी संदर्भ में HostingEnvironment.MapPath का उपयोग कर सकते हैं, जहां System.Webवस्तुएं HttpContext.Currentउपलब्ध नहीं हैं (जैसे एक स्थिर विधि से भी)।

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

यह भी देखें कि Server.MapPath और HostingEnvironment.MapPath में क्या अंतर है?


1
यह अच्छा है, लेकिन यह एक स्थिर वर्ग उदाहरण है, क्योंकि HostingEnvironment का मजाक उड़ाने का कोई आसान तरीका नहीं है ... :-(
जोश जी

6
ज़रूर, लेकिन आपके नियंत्रक या अन्य तर्क परत में जिसे आप परीक्षण करना चाहते हैं, आप केवल अपने स्वयं के अमूर्त पर निर्भरता IPathMapperलेंगे , जैसे (आप शायद इसे अन्य चिंताओं के एक समूह के साथ एक बड़े टूलबेल्ट / उपयोगिता इंटरफ़ेस में रोल करेंगे) विधि के साथ string MapPath(string virtualPath)। आपकी WebApi IPathMapperआवश्यकताओं के बारे में जानने के लिए केवल ठोस कार्यान्वयनSystem.Web.Hosting.HostingEnvironment
स्टुअर्टएलसी

1
@JoshG - आप Func <string, string> GetWebPath = HostingEnvironment.MapPath के माध्यम से HostingEnvironment.MapPath को सार कर सकते हैं और फिर एक मॉक के साथ परीक्षण समय पर GetWebPath को अधिलेखित कर सकते हैं।
सीन बी

ऐसा लग रहा है जैसे रिश्तेदार पथ से परेशान हैं../images/
AaA

नियंत्रक पथ दे रहा है, तो क्या मैं "HostingEnvironment" का उपयोग करके सेवा पथ प्राप्त कर सकता हूं?
Md असलम

13
string root = HttpContext.Current.Server.MapPath("~/App_Data");

16
आप WebAPI में HttpContext.Current का उपयोग नहीं करना चाहते हैं। स्व-होस्ट किए गए एपीआई के बारे में क्या? आप वहाँ होने के लिए HttpContext.Current में भरोसा नहीं कर सकते। इसके अलावा यह परीक्षण के अनुकूल नहीं है।
ट्रेवर डे कोएकोक

2

एक तरफ उन लोगों के साथ जो इस तरह से ठोकर खाते हैं, HostingEnvironment कॉल का उपयोग करने पर परीक्षण स्तर को चलाने का एक अच्छा तरीका है, अगर एक्सेस करने के लिए UNC साझा कहते हैं: \ example \ कि मैप किया गया है ~ / उदाहरण / आप इसे प्राप्त करने के लिए इसे निष्पादित कर सकते हैं IIS- एक्सप्रेस समस्याएँ:

#if DEBUG
    var fs = new FileStream(@"\\example\file",FileMode.Open, FileAccess.Read);
#else
    var fs = new FileStream(HostingEnvironment.MapPath("~/example/file"), FileMode.Open, FileAccess.Read);
#endif

मुझे लगता है कि उस स्थिति में उपयोगी है जब आपके पास किसी फ़ाइल पर स्थानीय रूप से परीक्षण करने का अधिकार है, लेकिन उत्पादन में एक बार एनवी मैपिंग की आवश्यकता है।


Fyi, HostingEnvironmentवर्ग System.Web.Hostingनामस्थान में है।
Dermot

2
HostingEnvironment DNX कोर 5.0 के लिए विकल्प क्या है ?
रोयडूकी

नया Startup.cs वर्ग अब निर्माण पर एक सार्वजनिक स्टार्टअप (IHostingEnvironment env) {} को शामिल करता है, संपत्ति मेरे दिमाग को खिसका देती है, बस दूसरे दिन ऐसा किया। यह आपको प्रति मिनट एक वातावरण को नियंत्रित करने की अनुमति देता है, और #if निर्देशों का उपयोग करके एक ऐप का निर्माण होता है जो कई वातावरणों में आसानी से तैनात टियर को पार कर सकता है।
नाथन टेग

1

मैं संदर्भ आपूर्ति से नहीं बता सकता, लेकिन अगर यह चलो कुछ तुम सिर्फ अनुप्रयोग स्टार्टअप पर क्या करने की जरूरत है, तो आप अभी भी उपयोग कर सकते हैं Server.MapPathमें WebApiHttpApplication; में जैसे Application_Start()

मैं आपके सीधे सवाल का जवाब दे रहा हूं; पहले से ही उल्लेख किया HostingEnvironment.MapPath()जाने वाला पसंदीदा समाधान है।


0

चूंकि Server.MapPath()वेब एपि (साबुन या रीस्ट) के भीतर मौजूद नहीं है, इसलिए आपको वेब सर्वर के संदर्भ- होम निर्देशिका के सापेक्ष स्थानीय- को निरूपित करना होगा। ऐसा करने का सबसे आसान तरीका है:

string AppContext.BaseDirectory { get;}

फिर आप किसी भी फ़ाइल के सापेक्ष पथ को मैप करने के लिए पथ स्ट्रिंग को संक्षिप्त करने के लिए इसका उपयोग कर सकते हैं।
नोट: स्ट्रिंग पथ हैं \और /जैसे वे mvc में नहीं हैं।

उदाहरण के लिए:

System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");

सही है- यह मानते हुए कि यह आपके उदाहरण में एक अच्छा रास्ता है


-1

चयनित उत्तर मेरे वेब API एप्लिकेशन में काम नहीं किया। मुझे इस्तेमाल करना था

System.Web.HttpRuntime.AppDomainAppPath

1
हालांकि ऐसा लगता है यह एक ही तरीका है कि आप अपने WebAPI एप्लिकेशन के लिए पथ प्राप्त कर सकते हैं, तो यह आपके आवेदन की आप रूट देता है, लेकिन इस तरह के रूप संबंधित पथ अनुवाद नहीं करता है ~\folderया ../images/शारीरिक पथ
एएए

-1

आप इस तरह की कोशिश कर सकते हैं:

var path = "~ / छवि / test.png"; System.Web.Hosting.HostingEnvironment.MapPath (@ + पथ)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.