Використання Server.MapPath у зовнішніх класах C # в ASP.NET


132

Я намагаюся отримати абсолютний шлях певних файлів до класу C #. Server.MapPathЗвичайно, чудово працює для ASPX та їх кодових сторінок, але цього немає у файлі іншого класу. Я намагався HostingEnvironment.MapPath(), але це скаржиться на те, що відносний віртуальний шлях заборонений. Будь-які думки?

System.Web вже імпортується.

Відповіді:


302

ServerUtilityКлас доступний як екземпляр в вашому HttpContext. Якщо ви перебуваєте в середовищі, де ви знаєте, що він буде виконаний у трубопроводі ASP.Net, ви можете використовувати

HttpContext.Current.Server.MapPath()

Вам доведеться імпортувати System.Web.


1
Незважаючи на те, що цій посаді більше 2 років, ти мені надзвичайно допоміг. Дякую.
iarwain01

6
Що робити, якщо воно не виконане в тому трубопроводі?
заїцман

Якщо ви не виконуєте ASP.Net всередині ASP.Net, навряд чи буде встановлено ваш HttpContext, якщо ви не написали власний конвеєр :) Вам доведеться покладатися на будь-які методи, які надає ваш контекст виконання (маршрутизатор?). Якщо ваш процес має розуміння основ вашого маршрутизації, ви можете ознайомитись із методами System.IO.Path.
утроба

Цей компільований, але контекст недійсний поза контролерами, тому мій код помилки. Я думаю, що матка там говорить те саме. Якщо це так, чи можете ви отримати доступ до MapPath поза маршрутизаторами?
edencorbin

34

Ви також можете використовувати:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

якщо

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

недоступний


8

Чи не можете ви просто додати посилання, System.Webа потім можете використовувати Server.MapPath?

Редагувати: Сьогодні я рекомендую використовувати HostingEnvironment.MapPathметод :

Це статичний метод в System.Webзборі, який відображає віртуальний шлях до фізичного шляху на сервері. Він не вимагає посилання на HttpContext.


Не на зовнішніх заняттях.
funtimelost

Звичайно, ви можете додати посилання на зовнішній клас; але очевидно, що вам потрібно використовувати його в контексті запиту сервера, щоб HttpContext не був нульовим.
Dan Diplo

4
System.Reflection.Assembly.GetAssembly(type).Location

ЯКЩО файл, який ви намагаєтеся отримати, це місце складання для типу. Але якщо файли відносяться до місця складання, ви можете використовувати це з System.IOпростором імен, щоб отримати точний шлях до файлу.


-1: Що змусило вас повірити, що він хоче розташування зборів?
Джон Сондерс

1
Він сказав, що "певні файли" він не вказує місцезнаходження або характер файлів, знаючи, таким чином, знаючи місце складання і можливість працювати щодо цього шляху, може бути корисним. Звичайно, якби він насправді заявив, що все ще знаходиться у HttpContext, я б не потурбувався відповідати.
Девід Макінг

Девід Маквінг, те, що ви пропонуєте, не працюватиме, оскільки IIS не завантажує збірки з місця, в яке ви їх встановите, на веб-сайті. Вони копіюються та завантажуються з тимчасового місця кешу asp.net, тому виконання GetAssembly або GetExecutingAssembly вкаже вас на місце складання, але це не має нічого спільного з розташуванням веб-сайту, на який вказує MapPath.
zumalifeguard


3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Тепер, коли ви викликаєте метод з коду, що знаходиться позаду

наприклад :

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

таким чином ваш код - простий і одним методом, ви можете використовувати декілька шляхів для кожного дзвінка :)


3

Цей мені допоміг

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

Ласкаво просимо в stackoverflow. Трохи більше пояснень допоможе колегам-програмістам зрозуміти, чому це рішення вийшло.
NJInamdar

1

Незалежно від того, працюєте ви в контексті ASP.NET чи ні, ви повинні мати можливість використовувати HostingEnvironment.ApplicationPhysicalPath


0

Server.mappath ("") буде працювати на сторінці aspx, якщо ви хочете отримати абсолютний шлях від файлу класу, ви повинні використовувати це-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.