No núcleo do ASP.NET, existe esse conceito conhecido como base do caminho . A idéia básica é bastante fácil de entender: a base do caminho é considerada um prefixo fixo para o caminho de todas as solicitações recebidas no seu aplicativo da web. Por padrão, a base do caminho é considerada a sequência vazia.
Isso significa que, por padrão, quando uma solicitação entra no seu aplicativo, toda a parte do caminho da URL da solicitação será mapeada para a Path
propriedade do HttpRequest
objeto e a PathBase
propriedade será definida comostring.empty
.
Como exemplo, considere um aplicativo principal do asp.net executando em sua máquina local e ouvindo a porta 3000
. Suponha que você esteja executando o aplicativo usando o servidor da web bruto do kestrel (para que não haja proxy reverso envolvido, as solicitações chegam diretamente ao kestrel).
Quando você solicita a URL http://localhost:3000/foo/bar
, o HttpRequest
objeto terá as seguintes propriedades:
HttpRequest.Path
será definido como /foo/bar
HttpRequest.PathBase
será definido como string.empty
Você terá a mesma situação ao decidir hospedar seu aplicativo no Azure, usando um serviço de aplicativo do Windows.
Nesse cenário de hospedagem, o padrão para um aplicativo Web principal do ASP.NET está sendo executado dentro do mesmo processo que o processo de trabalho do IIS. Isso basicamente significa que há apenas um processo envolvido; novamente, não há proxy reverso e o servidor da web kestrel não é usado: a solicitação é tratada diretamente pelo IIS (você pode encontrar alguns detalhes aqui, se estiver interessado).
Nesse caso, o URL público do seu aplicativo será semelhante https://my-application.azurewebsites.net
. Quando você navega para o URL https://my-application.azurewebsites.net/foo/bar
, a situação da solicitação http recebida será a seguinte:
HttpRequest.Path
será definido como /foo/bar
HttpRequest.PathBase
será definido como string.empty
Novamente, como antes, a base do caminho é a string vazia.
Existem diferentes cenários de hospedagem em que você pode decidir expor seu aplicativo usando um diretório virtual.
Por exemplo, você pode decidir hospedar o aplicativo Web principal do asp.net em seu próprio datacenter usando uma máquina virtual Windows com o IIS instalado. Nesse caso, você pode ter um site existente no IIS e deseja criar um aplicativo virtual com um alias adequado nesse site. Novamente neste cenário, conforme explicado acima para o serviço de aplicativo do azure windows, não há proxy reverso envolvido e o servidor da web kestrel não é usado: a solicitação é tratada diretamente pelo processo de trabalho do IIS ( no modelo de hospedagem de processo ).
Suponha que o URL público do seu site seja https://sample-application.contoso.net
e que você tenha escolhido sample-alias
o alias para o aplicativo virtual. Isso implica que todas as solicitações para seu aplicativo Web principal do asp.net terão uma parte do caminho iniciada por sample-alias
. Por exemplo, quando você deseja solicitar a página inicial do seu aplicativo, você navegará para https://sample-application.contoso.net/sample-alias
.
Nesse caso, quando você solicita a URL https://sample-application.contoso.net/sample-alias/foo/bar
, o HttpRequest
objeto no seu aplicativo será feito da seguinte maneira:
HttpRequest.Path
será definido como /foo/bar
HttpRequest.PathBase
será definido como sample-alias
Devido à maneira como o host da Web padrão para um aplicativo principal do ASP.NET é criado, esse cenário que envolve aplicativos virtuais do IIS funciona imediatamente e o pipeline de middleware está ciente do prefixo comum a todas as solicitações HTTP recebidas e pode defina a base do caminho sample-alias
e a propriedade path para a parte restante do caminho da solicitação recebida ( /foo/bar
no meu exemplo acima).
Como regra geral, você pode considerar que um aplicativo Web principal do ASP.NET funciona bem sem configurações adicionais quando desejar hospedá-lo usando o IIS. Isso também é válido para a propriedade base do caminho (verifique aqui para verificar se o caminho base da solicitação é definido automaticamente dentro do aplicativo no início).
Como último exemplo, considere hospedar seu aplicativo em uma máquina Linux, usando nginx como proxy reverso. Nesse caso, seu aplicativo será executado dentro do servidor da web Kestrel, mas não será exposto diretamente à Internet pública. O que está sendo exposto à Internet pública é o servidor da web nginx que roteia as solicitações HTTP recebidas para o servidor da web kestrel (onde seu aplicativo é executado). Você pode optar por configurar seu nginx para que todas as solicitações iniciadas pelo prefixo /awesome-application
sejam roteadas para o aplicativo da web principal do asp.net.
Como exemplo, suponha expor o nginx à Internet pública no URL https://ingress.contoso.net
: nesse caso, se você deseja solicitar a página inicial do seu aplicativo, você precisa navegar https://ingress.contoso.net/awesome-application/
.
Nesse caso, você não pode obter a awesome-application
base do caminho da solicitação gratuitamente (por padrão, o kestrel não está ciente disso e considera a base do caminho da solicitação string.empty
).
Para tornar o kestrel ciente da base do caminho da solicitação, você precisa usar o UsePathBaseMiddleware como o primeiro item no seu pipeline de middleware.
Se você precisar de mais detalhes para este caso, siga esta documentação e veja também esta pergunta sobre o stackoverflow .
Map
usado, os segmentos de caminho correspondentes são removidosHttpRequest.Path
e anexados aHttpRequest.PathBase
cada solicitação. .