在ASP.NET和IIS下,如果我有“〜/ content”形式的虚拟路径,我可以使用MapPath方法将其解析为物理位置:
HttpContext.Server.MapPath("~/content");
如何在OWIN主机下解析到物理位置的虚拟路径?
答案 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
}