如何解析OWIN主机下文件的虚拟路径?

时间:2014-07-04 09:40:12

标签: c# owin

在ASP.NET和IIS下,如果我有“〜/ content”形式的虚拟路径,我可以使用MapPath方法将其解析为物理位置:

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

如何在OWIN主机下解析到物理位置的虚拟路径?

6 个答案:

答案 0 :(得分:34)

您可以使用AppDomain.CurrentDomain.SetupInformation.ApplicationBase获取应用程序的根目录。使用根路径,您可以实现" MapPath"对于Owin。

我还不知道另一种方式。 (Microsoft.Owin.FileSystems.PhysicalFileSystem也使用ApplicationBase属性。)

答案 1 :(得分:19)

您不应该使用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";
}

答案 2 :(得分:1)

我正在添加另一个适用于ASP.NET Core的答案。有一个服务IHostingEnvironment,它是由框架添加的。

@if(! $questions->lastItem())
    <button class="btn btn-primary">Submit</button>
@else
    <a href="{{ $questions->previousPageUrl() }}"><button class="btn btn-primary">Previous Question</button></a>
    <a href="{{ $questions->nextPageUrl() }}"><button class="btn btn-primary">Next Question</button></a>
@endif
{{ Form::close() }}

答案 3 :(得分:1)

我有一个在OWIN自托管服务器(没有System.Web)上运行的API-遇到了此问题,需要在我们维护列表的地方加载文本文件。

这对我有用,可以从同事那里找到-config.text就在我的根目录中,紧挨着web.config:

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

答案 4 :(得分:0)

您可能没有几个不同的功能实现,如

Func<string, string>

之类的密钥下的不同启动代码提供
"Host.Virtualization.MapPath"

并将其放入OWIN字典中。或者您可以像这样创建基本类

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

并通过配置设置,命令行参数或环境变量选择实现。

答案 5 :(得分:0)

接受的答案AppDomain.CurrentDomain.SetupInformation.ApplicationBase在dnx / kestrel下对我不起作用 - 它返回了.dnx运行时的位置,而不是我的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
        }