كيفية الوصول إلى HttpServerUtility.MapPath الطريقة في موضوع أو الموقت ؟

StackOverflow https://stackoverflow.com/questions/111927

سؤال

يمكنني استخدام System.Timers.Timer في بلدي Asp.Net التطبيق لا تحتاج إلى استخدام HttpServerUtility.MapPath الطريقة التي يبدو أن تكون متاحة فقط عبر HttpContext.Current.Server.MapPath.المشكلة هي أن HttpContext.Current هو null عندما Timer.Elapsed الحدث الحرائق.

هل هناك طريقة أخرى للحصول على إشارة إلى HttpServerUtility الكائن ؟ أنا يمكن أن تضخ في صفي' منشئ.هل هو آمن ؟ كيف يمكنني التأكد من أنه لن يكون القمامة التي تم جمعها في نهاية الحالية الطلب ؟

وذلك بفضل!

هل كانت مفيدة؟

المحلول

أنه من الممكن استخدام HostingEnvironment.MapPath() بدلا من HttpContext.Current.Server.MapPath()

أنا لم أجربها حتى الآن في موضوع أو توقيت الحدث على الرغم من.


بعض (غير مجدية) حلول فكرت ؛

  • الطريقة الوحيدة يهمني على HttpServerUtility هو MapPath.وذلك كبديل لذلك يمكنني استخدام AppDomain.CurrentDomain.BaseDirectory وبناء مسارات بلدي من هذا. ولكن هذا سوف تفشل إذا كان التطبيق الخاص بك يستخدم الدلائل الظاهرية (لا الألغام).

  • نهج آخر:إضافة كافة مسارات أحتاج إلى Global فئة.حل هذه المسارات في Application_Start.

نصائح أخرى

أنا لا أعرف إذا كان هذا سوف تحل الدلائل الظاهرية المسألة ، ولكن يمكنني استخدام هذا MapPath:

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

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

HostingEnvironment ليس الحل الأمثل لأنه من الصعب جدا الفصل وهمية (انظر كيفية اختبار الوحدة البرمجية التي تستخدم HostingEnvironment.MapPath).

بالنسبة لأولئك الذين يحتاجون إلى الاختبار, طريقة أفضل يمكن إنشاء المسار الخاص بك-مخطط واجهة على النحو المقترح من قبل https://stackoverflow.com/a/1231962/85196, إلا تنفيذه

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

النتيجة بسهولة mockable ، يستخدم HostingEnvironment داخليا ، وحتى يمكن أن يحتمل أن تكون عنوان ase69s قلق في نفس الوقت.

يمكنك استدعاء MapPath وظيفة قبل بدء الموقت ، ببساطة ذاكرة التخزين المؤقت النتيجة ؟ هو تماما الضروره أن يكون MapPath الاتصال داخل القراد الحدث ؟

عندما الموقت ينقضي لا يوجد الحالية HTTP السياق.وذلك لأن توقيت الأحداث ليست ذات طلب HTTP.

ما يجب عليك القيام به هو استخدام HttpServerUtility.MapPath حيث HTTP السياق هو متاح.يمكنك أن تفعل ذلك في أحد طلب خط أنابيب الأحداث (مثل Page_Load) أو في عالمي.asax الحدث مثل Application_Start.

تعيين MapPath يؤدي إلى متغير يمكن الوصول إليها من جهاز ضبط الوقت.انقضى هذا الحدث ، حيث يمكن استخدام المسار.الجمع بين الحصول على موقع ملف معين تحتاج إليها.

أعتقد أن سبب ذلك هو باطل في ذلك الوقت (إذا كنت تفكر في ذلك) ، هو أن توقيت المنقضي الحدث لا يحدث كجزء من طلب HTTP (وبالتالي لا يوجد السياق).وهو ناتج عن شيء على الخادم الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top