OWIN Startup方法如何获取网站的基本URL?

OWIN启动方法如何获取网站的基本URL?

我正在尝试编写在使用IISExpress进行调试时可以正常工作的代码,使用自托管和IIS进行unit testing。

当自托管时,我可以在IAppBuilder.Properties [“host.Addresses”]中找到这些信息但是,当它在IISExpress下运行时(它没有检查IIS)它不存在。

 System.Web.VirtualPathUtility.ToAbsolute("~") 

对于vNext下的任何人,试试这个:

 public void Configure(IApplicationBuilder app) { app.Use(async (ctx, next) => { var hostingEnvironment = app.ApplicationServices.GetService(); 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运行时的文件夹,但可能在其他上下文中工作

请不要再发表此信息。 这不是一个公认的答案。 我保留这篇文章作为一种教育,以说明不要沿着我提供的道路前进。 很容易看出这个答案如何成为未经训练的眼睛的解决方案。

(编辑: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(); //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

[编辑回应评论]

如果您真的不相信context.Request在启动时可用,请查看此流程:

IOwinContext ,它“包装OWIN环境字典并提供强类型访问器”,它具有一个名为IOwinRequest的属性,它“获取一个暴露请求特定属性的包装器”。 它的类型为Microsoft.Owin.IOwinRequest ,它基本上具有属性Uri