Sous ASP.NET et IIS, si j'ai un chemin virtuel sous la forme "~/content", je peux le résoudre en un emplacement physique à l'aide de la méthode MapPath :
HttpContext.Server.MapPath("~/content");
Comment résoudre un chemin virtuel vers un emplacement physique sous un hôte OWIN?
Vous pouvez utiliser AppDomain.CurrentDomain.SetupInformation.ApplicationBase pour obtenir la racine de votre application. Avec le chemin racine, vous pouvez implémenter "MapPath" pour Owin.
Je ne sais pas encore autrement. (La propriété ApplicationBase
est également utilisée par Microsoft.Owin.FileSystems.PhysicalFileSystem .)
Vous ne devez pas utiliser HttpContext.Server
car il est uniquement disponible pour MVC. HostingEnvironment.MapPath()
est le chemin à parcourir. Cependant, ce n'est pas disponible pour owin auto-hébergement. Donc, vous devriez l'obtenir directement.
var path = HostingEnvironment.MapPath("~/content");
if (path == null)
{
var uriPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
path = new Uri(uriPath).LocalPath + "/content";
}
J'ajoute une autre réponse qui fonctionnerait pour ASP.NET Core. Il existe un service IHostingEnvironment, ajouté par le framework.
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();
}
}
Vous pouvez avoir peu d'implémentations différentes de fonctions comme
Func<string, string>
fourni par un code de démarrage différent sous clé comme
"Host.Virtualization.MapPath"
et le mettre dans le dictionnaire OWIN. Ou vous pouvez créer un cours de base comme celui-ci
public abstract class VirtualPathResolver {
string MapPath(string virtualPath);
}
et choisissez la mise en œuvre par paramètre de configuration, paramètre de ligne de commande ou variable d’environnement.
La réponse acceptée, AppDomain.CurrentDomain.SetupInformation.ApplicationBase, ne fonctionnait pas pour moi sous dnx/kestrel. Elle renvoyait l'emplacement de l'exécution .dnx et non mon itinéraire webapp.
C’est ce qui a fonctionné pour moi au démarrage d’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
}