Saya menggunakan System.Timers.Timer
aplikasi Asp.Net saya dan saya perlu menggunakan HttpServerUtility.MapPath
metode yang tampaknya hanya tersedia melalui HttpContext.Current.Server.MapPath
. Masalahnya adalah bahwa HttpContext.Current
adalah null
ketika Timer.Elapsed
peristiwa kebakaran.
Apakah ada cara lain untuk mendapatkan referensi ke objek HttpServerUtility? Saya bisa menyuntikkannya ke konstruktor kelas saya. Apakah ini aman? Bagaimana saya bisa yakin itu tidak akan Mengumpulkan Sampah di akhir permintaan saat ini?
Terima kasih!
sumber
Saya tidak tahu apakah ini akan menyelesaikan masalah direktori virtual Anda, tetapi saya menggunakan ini untuk 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('/', '\\'); }
sumber
HostingEnvironment bukanlah solusi yang tepat karena ini adalah kelas yang sangat sulit untuk diejek (lihat Cara menguji unit kode yang menggunakan HostingEnvironment.MapPath ).
Bagi mereka yang membutuhkan testability, cara yang lebih baik mungkin dengan membuat antarmuka mapper jalur Anda sendiri seperti yang diusulkan oleh https://stackoverflow.com/a/1231962/85196 , kecuali mengimplementasikannya sebagai
public class ServerPathMapper : IPathMapper { public string MapPath(string relativePath) { return HostingEnvironment.MapPath(relativePath); } }
Hasilnya mudah diolok-olok, menggunakan HostingEnvironment secara internal, dan bahkan berpotensi mengatasi masalah ase69s pada saat yang bersamaan.
sumber
Bisakah Anda tidak memanggil fungsi MapPath sebelum memulai pengatur waktu, dan cukup menyimpan hasilnya dalam cache? Apakah benar-benar perlu memiliki panggilan MapPath di dalam acara tick?
sumber
Saat timer berlalu, tidak ada konteks HTTP saat ini. Ini karena peristiwa pengatur waktu tidak terkait dengan permintaan HTTP tertentu.
Yang harus Anda lakukan adalah menggunakan HttpServerUtility.MapPath di mana konteks HTTP tersedia. Anda dapat melakukannya di salah satu acara pipeline permintaan (seperti Page_Load) atau di acara Global.asax seperti Application_Start.
Tetapkan hasil MapPath ke variabel yang dapat diakses dari acara Timer.Elapsed, di mana Anda dapat menggunakan Path.Combine untuk mendapatkan lokasi file tertentu yang Anda butuhkan.
sumber
Saya pikir alasan mengapa itu nol pada waktu itu (jika Anda memikirkannya), adalah bahwa peristiwa waktu berlalu pengatur waktu tidak terjadi sebagai bagian dari permintaan HTTP (karenanya tidak ada konteks). Ini disebabkan oleh sesuatu di server Anda.
sumber