Використання 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.