简体   繁体   中英

httpcontext.current.server.mappath Object reference not set to an instance of an object

I am using the following code within a class:

string filePath = HttpContext.Current.Server.MapPath("~/email/teste.html");

The file teste.html is in the folder

But when it will open the file the following error is being generated:

Object reference not set to an instance of an object.

Don't use Server.MapPath. It's slow. Use this instead, HttpRuntime.AppDomainAppPath . As long as your web site is running, this property is always available to you.

Then use it like this:

string filePath = Path.Combine(HttpRuntime.AppDomainAppPath, "email/teste.html");

if the code is not running from within a thread is executing a httprequest then HttpContext.Current is null (for example when you method is called via BeginInvoke ) - see http://forums.asp.net/t/1131004.aspx/1 .

You can always use HttpRuntime see http://msdn.microsoft.com/en-us/library/system.web.httpruntime.aspx

If there is no HttpContext (eg when the method is called via BeginInvoke , as Yahia pointed out), the call to HttpContext.Current.Server.MapPath() must fail. For those scenarios, there's HostingEnvironment.MapPath() in the System.Web.Hosting namespace.

string filePath = HostingEnvironment.MapPath("~/email/teste.html");

Issue: I had an "Images" folder inside a class library project. But using the above answers, I was not able to get the physical path of the folder to read/write the files inside that folder.

Solution: The below code worked for me to get a physical path in the class library project.

string physicalPath = System.IO.Path.GetFullPath("..\\..\\Images");

I hope, it will help someone who is facing the same issue as me.

You can use something like the following piece of code. One thing to note is that I was facing an issue, where I was trying to access a .txt file from within a TestMethod and everything was failing except for this...and yeah it works for non-Unit Test Scenarios too.

string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\\..") + "\\\\email\\\\teste.html";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM