মাইক্রোসফ্ট ওয়েব এপিআই: আপনি একটি সার্ভার.ম্যাপপ্যাথ কীভাবে করবেন?


239

যেহেতু মাইক্রোসফট ওয়েব এপিআই নয় MVC , আপনি এটির মতো কিছু করতে পারে না:

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

না এই

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

কারণ এগুলি System.Webনেমস্পেসের অধীনে, নেমস্পেসের নীচে System.Web.Http

সুতরাং আপনি কীভাবে ওয়েব এপিআইতে আপেক্ষিক সার্ভারের পথটি বের করতে পারেন ?
আমি এমভিসিতে এরকম কিছু করতাম :

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

যা আমাকে ডিস্কে পরম পথ দেবে:

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

উত্তর:


469

আপনি যেকোন প্রসঙ্গে যেখানে হোস্টিংইনচারমেন্ট.ম্যাপপথ ব্যবহার করতে পারেন যেখানে System.Webঅবজেক্টগুলি HttpContext.Currentউপলভ্য নয় (যেমন স্ট্যাটিক পদ্ধতি থেকেও)।

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

এছাড়াও দেখুন সার্ভার.ম্যাপপথ এবং হোস্টিংইনচারমেন্ট.ম্যাপপথের মধ্যে পার্থক্য কী?


1
এটি দুর্দান্ত, তবে হোস্টিং পরিবেশের উপহাস করার কোনও সহজ উপায় নেই কারণ এটি একটি স্থির শ্রেণীর উদাহরণ ... :-(
জোশ জি

6
অবশ্যই, তবে আপনি যে কন্ট্রোলার বা অন্যান্য যুক্তি স্তরকে যাচাই করতে চান তাতে আপনি কেবল নিজের বিমূর্তির উপর নির্ভরশীলতা নেবেন, যেমন IPathMapper(আপনি সম্ভবত এটি উদ্বেগের একগুচ্ছ আরও বড় সরঞ্জামবেল্ট / ইউটিলিটি ইন্টারফেসে নিয়ে যাবেন) পদ্ধতি সহ string MapPath(string virtualPath)। আপনার WebApi IPathMapperপ্রয়োজনীয়তার জন্য কেবল কংক্রিট বাস্তবায়নSystem.Web.Hosting.HostingEnvironment
স্টুয়ার্টলসি

1
@ জোশজি - আপনি ফানক <স্ট্রিং, স্ট্রিং> গেট ওয়েবপ্যাথ = হোস্টিংইনভায়রনমেন্ট.ম্যাপপথের মাধ্যমে হোস্টিংইনচারমেন্ট.ম্যাপপথটি বিমূর্ত করতে পারেন এবং তারপরে পরীক্ষার সময়ে একটি উইক দিয়ে গেটওয়েবপথকে ওভাররাইট করতে পারেন।
শন বি

দেখে মনে হচ্ছে এটি আপেক্ষিক পাথগুলির সাথে সমস্যা করছে../images/
এএএ

এটি নিয়ামককে পাথ দিচ্ছে, তাই আমি কী "হোস্টিং পরিবেশ" ব্যবহার করে পরিষেবা পাথটি পেতে পারি?
মোঃ আসলাম

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

16
আপনি ওয়েবএপিআই-তে এইচটিটিপি কনটেক্সট ব্যবহার করতে চান না urrent স্ব-হোস্ট করা API গুলি সম্পর্কে কী? আপনি HttpContext- এ নির্ভর করতে পারবেন না urrent এছাড়াও এটি পরীক্ষা বান্ধব নয়।
ট্রেভর ডি কোয়েকোয়েক

2

এগুলি জুড়ে যেগুলি হোঁচট খাচ্ছে তাদের পক্ষে, হোস্টিংএইনভায়রনমেন্ট কলটি ব্যবহার করে পরীক্ষা স্তর চালানোর জন্য একটি দুর্দান্ত উপায় হ'ল যদি কোনও ইউএনসি শেয়ারকে বলা হয়: \ উদাহরণস্বরূপ \ যা ম্যাপ করা হয়েছে ~ / উদাহরণ / আপনি এটিকে কার্যকর করতে পারেন আইআইএস-এক্সপ্রেস বিষয়গুলি:

#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

স্থানীয়ভাবে কোনও ফাইলে পরীক্ষা করার অধিকার আপনার কাছে পাওয়া গেলে আমি এটিকে সহায়ক বলে মনে করি, তবে একবার উত্পাদনে vর্ষা ম্যাপিংয়ের প্রয়োজন।


ফাই, HostingEnvironmentক্লাসটি System.Web.Hostingনামস্থানে রয়েছে।
ডার্মোট

2
HostingEnvironment ডিএনএক্স কোর 5.0 এর বিকল্প কী ?
রোয়ডুকি

নতুন স্টার্টআপ.স ক্লাস এখন একটি পাবলিক স্টার্টআপ (আইহোস্টিংএএনভায়রন এনভায়রনমেন্ট) ইনজেক্ট করেছে construction construction নির্মাণের উপর, সম্পত্তিটি আমার মন কেটে যায়, ঠিক অন্য দিন এটি করেছে। এটি আপনাকে উদাহরণস্বরূপ কোনও পরিবেশকে নিয়ন্ত্রণ করতেও সহায়তা করে এবং # আইফির নির্দেশিকা ব্যবহার করে এমন অ্যাপ্লিকেশন তৈরি করে যা একাধিক পরিবেশে স্তরকে সহজেই মোতায়েন করতে পারে।
নাথান টেগি

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}");

সত্য হিসাবে প্রত্যাবর্তন করে যে এটি আপনার উদাহরণের একটি দুর্দান্ত পথ sound


-1

নির্বাচিত উত্তরটি আমার ওয়েব এপিআই অ্যাপ্লিকেশনটিতে কাজ করে না। আমাকে ব্যবহার করতে হয়েছিল

System.Web.HttpRuntime.AppDomainAppPath

1
যদিও মনে হয় এই একমাত্র উপায় আপনি আপনার WebApi অ্যাপ্লিকেশন পাথ পেতে পারেন, এই আপনার আবেদনের আপনি যদি root পরিচয় দেয় কিন্তু যেমন আপেক্ষিক পাথ অনুবাদ না ~\folderবা ../images/শারীরিক পাথ
AAA

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.