OWIN启动方法如何获取网站的基本URL?
我正在尝试编写在使用IISExpress进行调试时可以正常工作的代码,使用自托管和IIS进行单元测试。
当自托管时,我可以在IAppBuilder.Properties [“host.Addresses”]中找到此信息,但是,当它在IISExpress下运行时(它没有检查IIS),它不存在。
答案 0 :(得分:3)
System.Web.VirtualPathUtility.ToAbsolute("~")
答案 1 :(得分:0)
请不要再发表此信息。这不是一个公认的答案。我保留这篇文章作为教育,以说明不要走我提供的道路。很容易看出这个答案如何成为未经训练的眼睛的解决方案。
(编辑:2016年10月6日)
好的,所以这篇文章下面的对话并没有帮助我理解为什么我错了。所以我问了朋友,同事,最后得到了当地社区的一个很好的答复,我更多地解释了这个对话以及为什么这个答案还不够。有人提到,下面没有回答基本URL的启动应用程序请求,它回答了如何使用请求处理来检索获取所请求应用程序的基本URL。不同的是,请求处理在每次请求时都获取基本URL;而从启动应用程序中获取基本URL只发生一次,并且仅在应用程序开始时保留所请求应用程序的值。
老实说,我没有看到或查看任何允许您在当前请求处理方案之外检索基本URL的文档。我也不确定它是否可能在.NET堆栈的当前状态下。再说一遍,我为没有指出这一点并对解决方案感到困惑而道歉。
对于那些仍然希望使用解决方法从您请求的应用程序(可能来自启动应用程序或其他类型的外部应用程序)获取基本URL的人,并且不介意每次获取它请求,并且不介意稍后检索基本URL的时间点,下面的解决方案将回答这个问题。
这是一篇很好的文章,解释了使用Owin中间件管道:
http://blog.2mas.xyz/owin-middleware/
您可以使用接受上下文的app.Run,或接受上下文的app.Use,然后使用Func类型的下一步(获取管道中的下一步)。
public void Configuration(IAppBuilder app)
{
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
//First way using app.Use
var currentUri1 = "";
app.Use((context, next) => {
currentUri1 = context.Request.Uri.ToString(); //Get base URL
return next().ContinueWith(task =>
{
context.Response.WriteAsync(" FINISHED RETRIEVING CURRENT URL ");
});
});
//Second way using app.Run
var currentUri2 = "";
app.Run((context) => {
currentUri2 = context.Request.Uri.ToString(); //Get base URL
var task = context.Response.WriteAsync("Hello world! " + context.Request.Path);
return task;
});
}
context.Request本质上是传入请求的包装器,它的类型为IOwinRequest。更多信息可在此处找到:IOwinRequest Interface
IOwinRequest的Uri属性是System.Uri类型,因此您可以在此处查看Uri附带的属性(如主机,端口,绝对URL,查询变量等):Uri Class < / p>
[编辑回应评论]
如果您真的不相信context.Request在启动时可用,请查看此流程:
IOwinContext,它“包装OWIN环境字典并提供强类型访问器”,它具有一个名为IOwinRequest的属性,它“获取一个暴露请求特定属性的包装器”。它的类型为Microsoft.Owin.IOwinRequest,基本上具有属性Uri
答案 2 :(得分:-1)
对于vNext下的任何人,请尝试以下操作:
public void Configure(IApplicationBuilder app)
{
app.Use(async (ctx, next) =>
{
var hostingEnvironment = app.ApplicationServices.GetService<IHostingEnvironment>();
var realPath = hostingEnvironment.WebRootPath + ctx.Request.Path.Value;
// do something with the file
await next();
});
}
如果您不在vnext之下,我确实在vNext / dnx下看到了这个对我不起作用的答案:https://stackoverflow.com/a/24747658/486028
Path.GetDirectoryName(Assembly.GetExecutingAssembly()。的GetName()。基本代码)
在dnx下,这只是游戏包含.dnx运行时的文件夹,但可能在其他上下文中工作