Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

Я добавляю еще один ответ, который будет работать для 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();
    }
}

Ответ 4

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

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

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

Ответ 5

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

Func<string, string>

предоставляемый различным кодом запуска под клавишей типа

"Host.Virtualization.MapPath"

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

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

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

Ответ 6

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

Это то, что сработало для меня в запуске 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
        }