Qual é a diferença entre HttpRequest.Path e HttpRequest.PathBase no ASP.NET Core?

8

Conforme detalhado aqui: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.httprequest?view=aspnetcore-3.0 , a HttpRequestclasse do ASP.NET Core inclui propriedades Pathe ambos PathBase.

Qual é a diferença entre essas duas propriedades? Para que cada um é usado? Qual o significado de PathBase? Qual é o significado de ter um Pathe um PathBase?

Não consigo encontrar nenhuma documentação detalhando por que está como está - alguma idéia?

James Law
fonte

Respostas:

14

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 Pathpropriedade do HttpRequestobjeto e a PathBasepropriedade 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 HttpRequestobjeto 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.nete que você tenha escolhido sample-aliaso 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 HttpRequestobjeto 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-aliase a propriedade path para a parte restante do caminho da solicitação recebida ( /foo/barno 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-applicationsejam 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-applicationbase 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 .

Enrico Massone
fonte
1
Há um pouco mais sobre isso: Use, Run e Map . Por exemplo: Quando Mapusado, os segmentos de caminho correspondentes são removidos HttpRequest.Pathe anexados a HttpRequest.PathBasecada solicitação. .
21419 Kirk Larkin