কোনও থ্রেড বা টাইমারে এইচটিটিপি সার্ভার ইউটিলিটি.ম্যাপপথ পদ্ধতিটি কীভাবে অ্যাক্সেস করবেন?


89

আমি System.Timers.Timerআমার Asp.Net অ্যাপ্লিকেশনটিতে একটি ব্যবহার করি এবং আমাকে এমন HttpServerUtility.MapPathপদ্ধতি ব্যবহার করতে হবে যা মনে হয় কেবল এটির মাধ্যমেই উপলব্ধ HttpContext.Current.Server.MapPath। সমস্যা হল HttpContext.Currentহয় nullযখন Timer.Elapsedঘটনা দাবানল।

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

ধন্যবাদ!

উত্তর:


143

HostingEnvironment.MapPath()পরিবর্তে এটি ব্যবহার করা সম্ভবHttpContext.Current.Server.MapPath()

যদিও আমি এখনও এটি কোনও থ্রেড বা টাইমার ইভেন্টে চেষ্টা করি নি।


আমি বিবেচিত কিছু (অযোগ্য অযোগ্য) সমাধান;

  • শুধুমাত্র পদ্ধতি আমি উপর গ্রাহ্য HttpServerUtilityহয় MapPath। সুতরাং বিকল্প হিসাবে আমি এটি AppDomain.CurrentDomain.BaseDirectoryথেকে আমার পথগুলি ব্যবহার করতে এবং তৈরি করতে পারি। তবে আপনার অ্যাপটি ভার্চুয়াল ডিরেক্টরিগুলি ব্যবহার করে যদি ( ব্যর্থ হয়) Mine

  • আরেকটি পদ্ধতি: Globalক্লাসে আমার প্রয়োজনীয় সমস্ত পথ যুক্ত করুন । এই পাথগুলি সমাধান করুন Application_Start


4
তবে উল্লেখ্য যে উপরেরগুলি আইআইএসের পরবর্তী সংস্করণগুলিতে কাজ করে না। আইআইএস In-তে অ্যাপ্লিকেশন শুরুটি কোনও http অনুরোধের বাইরে কল করা যেতে পারে। যে, কোড উদাহরণ। আমি নিশ্চিত যে হোস্টিং-এনভায়রনমেন্ট.ম্যাপপথ () এখনও আগের মতো কাজ করবে।
রব্বা

তবে হোস্টিংইনোয়রনমেন্ট.ম্যাপপথ () ফোল্ডারটির পাথ সরাসরি পাওয়ার জন্য আপনি যদি এটি পাস করেন এবং খালি স্ট্রিংটি দেয় তবে একটি ত্রুটি দেয় ... HttpContext.Current.Server.MapPath (""); -> হোস্টিংএনরুমেন্টেশন.ম্যাপপ্যাথ ("") কাজ করে; -> ত্রুটি উত্থাপন করে
ভিএসপি

14

আমি জানি না এটি আপনার ভার্চুয়াল ডিরেক্টরিগুলির সমস্যার সমাধান করবে কিনা তবে আমি এটি ম্যাপপথের জন্য ব্যবহার করি:

public static string MapPath(string path)
{
    if (HttpContext.Current != null)
        return HttpContext.Current.Server.MapPath(path);

    return HttpRuntime.AppDomainAppPath + path.Replace("~", string.Empty).Replace('/', '\\');
}

পাথ.পরিবর্তন ("~", স্ট্রিং.এম্পটি) পথ হওয়া উচিত ep প্রতিস্থাপন ('~', '।')
স্লাভা

13

হোস্টিংএইনভায়রনমেন্ট সঠিক সমাধান নয় কারণ এটি উপহাস করা খুব কঠিন শ্রেণি ( হোস্টিংএইনভায়রনমেন্ট.ম্যাপপথ ব্যবহার করে এমন পরীক্ষার কোডটি কীভাবে করা যায় তা দেখুন )।

যাদের টেস্টিবিলিটি দরকার তাদের জন্য https://stackoverflow.com/a/1231962/85196 দ্বারা প্রস্তাবিত হিসাবে নিজের প্যাথ-ম্যাপার ইন্টারফেস তৈরি করা এর চেয়ে ভাল উপায় হতে পারে এটি প্রয়োগ না করে as

public class ServerPathMapper : IPathMapper { 
 public string MapPath(string relativePath) { 
      return HostingEnvironment.MapPath(relativePath); 
 } 
} 

ফলাফলটি সহজেই বিদ্রূপযোগ্য, অভ্যন্তরীণভাবে হোস্টিং-এন্টারভায়রনমেন্ট ব্যবহার করে এবং একই সময়ে ase69 এর উদ্বেগকেও সম্ভাব্যভাবে সম্বোধন করতে পারে ।


এটি আমাকে System.Web বা System.Net গ্রন্থাগারে রেফারেন্সিংয়ের নীচে নির্ভরতার প্রয়োজন ছাড়াই কোনও ওয়েব এপিআই প্রকল্পের জন্য পাথ রেজোলিউশনের জন্য একটি বাস্তবায়ন সরবরাহ করার অনুমতি দেয়। +1
ডেভিড পিটারসন

এই পদ্ধতির ডিআই এবং টেস্টিবিলিটির জন্য থাম্বস আপ করুন
দিলহান জয়থিলাকে 6:59

2

আপনি কি টাইমার শুরু করার আগে ম্যাপপথ ফাংশনটিতে কল করতে পারবেন না এবং কেবল ফলাফলটি ক্যাশে করবেন? টিক ইভেন্টের ভিতরে ম্যাপপথ কল করা কি একেবারেই প্রয়োজনীয়?


2

যখন টাইমারটি প্রবাহিত হবে, কোনও বর্তমান এইচটিটিপি প্রসঙ্গ নেই। এটি কারণ টাইমার ইভেন্টগুলি নির্দিষ্ট HTTP অনুরোধের সাথে সম্পর্কিত নয়।

আপনার যা করা উচিত তা হ'ল এইচটিপি সার্ভার ইউটিলিটি M ম্যাপপথ যেখানে HTTP প্রসঙ্গ উপলব্ধ। আপনি এটি অনুরোধ পাইপলাইন ইভেন্টগুলির মধ্যে একটিতে (যেমন পেজ_ল্ড) বা অ্যাপ্লিকেশন_স্টার্টের মতো একটি গ্লোবাল.অ্যাক্সেস ইভেন্টে করতে পারেন।

টাইমার.এলপসড ইভেন্ট থেকে অ্যাক্সেসযোগ্য ভেরিয়েবলকে ম্যাপপথের ফলাফল নির্ধারণ করুন, যেখানে আপনি প্রয়োজনীয় একটি নির্দিষ্ট ফাইলের অবস্থান পেতে আপনি পাথ.কোমাইন ব্যবহার করতে পারেন।


0

আমি মনে করি যে কেন এটি সেই সময় নালার কারণ (যদি আপনি এটি সম্পর্কে চিন্তা করেন), তবে এটি হ'ল যে টাইমার বর্ধিত ইভেন্টটি এইচটিটিপি অনুরোধের অংশ হিসাবে ঘটে না (তাই কোনও প্রসঙ্গ নেই)। এটি আপনার সার্ভারে কোনও কারণে ঘটে।

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