web-dev-qa-db-fra.com

Comment résoudre un chemin virtuel vers un fichier sous un hôte OWIN?

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?

29
Paul Turner

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 .)

34
TN.

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";
}
19
Boris Lipschitz

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();
    }
}
1
Boris Lipschitz

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.

0
Konstantin Isaev

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
        }
0
brendanrichards