C# 什么';ASP.NET核心中的HttpRequest.Path和HttpRequest.PathBase之间的区别是什么?

C# 什么';ASP.NET核心中的HttpRequest.Path和HttpRequest.PathBase之间的区别是什么?,c#,asp.net-core,C#,Asp.net Core,如本文所述:,ASP.NET核心的HttpRequest类包括Path和PathBase属性 这两种属性有什么区别?每个都是用来做什么的?PathBase的含义是什么?同时拥有路径和路径库有什么意义 我找不到任何文档详细说明它为什么是这样-有什么想法吗?在ASP.NET核心中,有一个称为路径库的概念。其基本思想很容易理解:路径基被认为是指向web应用程序的所有传入请求的路径的固定前缀。默认情况下,路径基被视为空字符串 这意味着,默认情况下,当请求进入应用程序时,请求URL的所有路径部分将映射到H

如本文所述:,ASP.NET核心的
HttpRequest
类包括
Path
PathBase
属性

这两种属性有什么区别?每个都是用来做什么的?
PathBase
的含义是什么?同时拥有
路径
路径库
有什么意义


我找不到任何文档详细说明它为什么是这样-有什么想法吗?

在ASP.NET核心中,有一个称为路径库的概念。其基本思想很容易理解:路径基被认为是指向web应用程序的所有传入请求的路径的固定前缀。默认情况下,路径基被视为空字符串

这意味着,默认情况下,当请求进入应用程序时,请求URL的所有路径部分将映射到
HttpRequest
对象的
path
属性,并且
PathBase
属性将设置为
string.empty

例如,考虑运行在本地机器上的ASP.NET核心应用程序,并监听端口<代码> 3000 。假设您使用原始kestrel web服务器运行应用程序(因此不涉及反向代理,请求直接到达kestrel)

当您请求URL
http://localhost:3000/foo/bar
HttpRequest
对象将具有以下属性:

  • HttpRequest.Path
    将设置为
    /foo/bar
  • HttpRequest.PathBase
    将设置为
    string.empty
当您决定使用windows应用程序服务在Azure上托管应用程序时,也会遇到同样的情况

在此托管场景中,ASP.NET核心web应用程序的默认值将在与IIS工作进程相同的进程内执行。这基本上意味着只涉及一个过程;同样,没有反向代理,kestrel web服务器也没有使用:请求由IIS直接处理(如果您感兴趣,可以找到一些详细信息)

在这种情况下,应用程序的公共URL类似于
https://my-application.azurewebsites.net
。当您浏览到URL
https://my-application.azurewebsites.net/foo/bar
,传入http请求的情况如下:

  • HttpRequest.Path
    将设置为
    /foo/bar
  • HttpRequest.PathBase
    将设置为
    string.empty
同样,与前面一样,路径基是空字符串

在不同的托管场景中,您可能决定使用虚拟目录公开应用程序

例如,您可能决定使用安装了IIS的windows虚拟机在自己的数据中心中托管asp.net核心web应用程序。在这种情况下,您可能在IIS中有一个现有网站,并且希望在该网站下创建一个具有正确别名的虚拟应用程序。同样在这个场景中,正如上面对azure windows应用程序服务所解释的,不涉及反向代理,并且根本不使用kestrel web服务器:请求直接由IIS工作进程()处理

假设您网站的公共URL为
https://sample-application.contoso.net
并且您已选择
示例别名
作为虚拟应用程序的别名。这意味着对asp.net核心web应用程序的所有请求都将有一个以
示例别名
开头的路径部分。例如,当您需要应用程序的主页时,您将浏览到
https://sample-application.contoso.net/sample-alias

在这种情况下,当您请求URL
https://sample-application.contoso.net/sample-alias/foo/bar
,应用程序中的
HttpRequest
对象将按以下方式执行:

  • HttpRequest.Path
    将设置为
    /foo/bar
  • HttpRequest.PathBase
    将设置为
    sample alias
由于ASP.NET核心应用程序的默认web主机的构建方式,这个涉及IIS虚拟应用程序的场景是开箱即用的,中间件管道知道所有传入HTTP请求的公共前缀,并且能够将路径基设置为
sample alias
,将path属性设置为传入请求路径的剩余部分(在上面的示例中为
/foo/bar
).

作为一个经验法则,您可以考虑ASP.NET核心Web应用程序在没有使用任何附加配置的情况下运行良好,当您想通过IIS托管它时。path base属性也是如此(检查以验证请求基本路径是否在stratup时在应用程序内部自动设置)

作为最后一个例子,考虑将您的应用程序托管在Linux机器上,使用NGINX作为反向代理。在这种情况下,您的应用程序将在kestrel web服务器内执行,但它不会直接暴露在公共internet上。向公共互联网公开的东西是nginxweb服务器,它将传入的HTTP请求路由到kestrelweb服务器(执行应用程序的地方)。您可以决定配置nginx,以便所有以前缀

/awesome application
开头的请求都将路由到asp.net核心web应用程序

例如,假设在URL
https://ingress.contoso.net
:在这种情况下,如果您想请求应用程序的主页,您需要浏览到
https://ingress.contoso.net/awesome-application/

在这种情况下,您无法获得
awesome-a