我保留这篇文章是为了说明不要走我提供的道路。很容易看出这个答案是如何解决未经训练的眼睛的。
(编辑:2016 年 10 月 6 日)
好的,所以这篇文章下面的对话并没有帮助我理解我为什么错了。所以我问了朋友、同事,最后从当地社区得到了一个很好的答案,我参与其中,以更多地解释对话以及为什么这个答案还不够。有人提到,下面不回答基本 URL 的启动应用程序请求,它回答了如何使用请求处理检索获取所请求应用程序的基本 URL。不同之处在于,请求处理在每次请求时获取基本 URL;而从启动应用程序中获取基本 URL 只发生一次,并且仅在应用程序启动时才保留请求的应用程序的值。
老实说,我还没有看到或查看任何类型的文档,可让您在当前请求处理方案之外检索基本 URL。我也不确定在 .NET 堆栈的当前状态下是否有可能。再次,对于没有指出这一点并对解决方案感到困惑,我深表歉意。
对于那些仍然想使用解决方法从请求的应用程序(可能来自启动应用程序..或其他类型的外部应用程序)获取基本 url 并且不介意每次获取它的人请求,并且不介意稍后将检索基本 URL 的时间点,下面的解决方案回答了这个问题。
(原方案)
这是一篇很好的文章,解释了如何使用 Owin 中间件管道:
http://blog.2mas.xyz/owin-middleware/
您可以使用 app.Run 接受上下文,或者 app.Use 接受上下文,然后使用 Func 类型的 next(获取管道中的下一步)。
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
[编辑回应评论]
如果您真的不相信 context.Request 在启动时可用,请查看此流程:
IOwinContext,它“包装 OWIN 环境字典并提供强类型访问器”,它有一个名为 IOwinRequest 的属性,它“获取一个暴露请求特定属性的包装器”。它是Microsoft.Owin.IOwinRequest 类型,本质上具有Uri 属性