Как вы разрешаете виртуальный путь к файлу на хосте OWIN?

В ASP.NET и IIS, если у меня есть виртуальный путь в форме "~/content", я могу разрешить это в физическом местоположении с помощью метода MapPath:

HttpContext.Server.MapPath("~/content");

Как вы можете разрешить виртуальные пути к физическому местоположению на хосте OWIN?

5 ответов

Решение

Вы можете использовать AppDomain.CurrentDomain.SetupInformation.ApplicationBase для получения корня вашего приложения. Используя корневой путь, вы можете реализовать MapPath для Owin.

Я пока не знаю другого пути. (The ApplicationBase свойство также используется Microsoft.Owin.FileSystems.PhysicalFileSystem.)

Вы не должны использовать HttpContext.Server поскольку это доступно только для MVC. HostingEnvironment.MapPath() это путь Тем не менее, он не доступен для самостоятельного размещения. Итак, вы должны получить это напрямую.

var path = HostingEnvironment.MapPath("~/content");
if (path == null)
{
    var uriPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
    path = new Uri(uriPath).LocalPath + "/content";
}

Принятый ответ AppDomain.CurrentDomain.SetupInformation.ApplicationBase не работает для меня в dnx / kestrel - он возвращает местоположение среды выполнения.dnx, а не мой маршрут веб-приложения.

Вот что у меня сработало в стартапе OWIN:

public void Configure(IApplicationBuilder app)
        {
        app.Use(async (ctx, next) =>
            {
                var hostingEnvironment = app.ApplicationServices.GetService<IHostingEnvironment>();
                var realPath = hostingEnvironment.WebRootPath + ctx.Request.Path.Value;

                // so something with the file here

                await next();
            });

            // more owin setup
        }

Я добавляю еще один ответ, который будет работать для ASP.NET Core. Есть сервис IHostingEnvironment, и он добавляется фреймворком.

public class ValuesController : Controller
{
    private IHostingEnvironment _env;

    public ValuesController(IHostingEnvironment env)
    {
        _env = env;
    }

    public IActionResult Get()
    {
        var webRoot = _env.WebRootPath;
        var file = Path.Combine(webRoot, "test.txt");
        File.WriteAllText(file, "Hello World!");
        return OK();
    }
}

У меня есть API, работающий на собственном хосте OWIN (без System.Web) - столкнулся с этой проблемой, требующей загрузки текстового файла, в котором мы ведем список.

Это сработало для меня, полученное от коллеги - config.text находится прямо в моем корне рядом с web.config:

var path = AppDomain.CurrentDomain.BaseDirectory + "/config.txt";

У вас может быть несколько разных реализаций функций, таких как

Func<string, string>

предоставляется другой код запуска под ключом, как

"Host.Virtualization.MapPath"

и положить его в словарь OWIN. Или вы можете создать базовый класс, как это

public abstract class VirtualPathResolver { 
    string MapPath(string virtualPath);
}

и выберите реализацию по настройке конфигурации, параметру командной строки или переменной среды.

Другие вопросы по тегам