Как вы разрешаете виртуальный путь к файлу под хостом OWIN?
В ASP.NET и IIS, если у меня есть виртуальный путь в форме "~/content", я могу разрешить это в физическом местоположении, используя MapPath:
HttpContext.Server.MapPath("~/content");
Как вы можете разрешить виртуальные пути к физическому местоположению под хостом OWIN?
Ответы
Ответ 1
Вы можете использовать AppDomain.CurrentDomain.SetupInformation.ApplicationBase, чтобы получить доступ к вашему приложению. С корневым путем вы можете реализовать "MapPath" для Owin.
Я еще не знаю другого пути. (Свойство ApplicationBase
также используется Microsoft.Owin.FileSystems.PhysicalFileSystem.)
Ответ 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
}