O que é routes.IgnoreRoute (“{resource} .axd / {* pathInfo}”)

95

O que é routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Não consigo encontrar nenhum arquivo .axd em meu projeto, posso remover esta regra de rota?

Eric Yin
fonte

Respostas:

81

Os arquivos .axd não existem fisicamente. O ASP.NET usa URLs com extensões .axd (ScriptResource.axd e WebResource.axd) internamente e são manipulados por um HttpHandler.

Portanto, você deve manter esta regra, para evitar que a ASP.NET MVC tente lidar com a solicitação em vez de permitir que o HttpHandler dedicado o faça.

Roy Dictus
fonte
5
Tenho certeza de que você gostaria que as pessoas pudessem baixar os "arquivos axd" em seu site, pois eles contêm javascript e estilos.
Moulde,
3
Esta resposta está incorreta. A razão para colocar IgnoreRoutena configuração de roteamento do MVC é garantir que o MVC não tente lidar com a solicitação. Isso ocorre porque os .axdterminais precisam ser manipulados por outro manipulador HTTP (um manipulador que não faz parte do MVC) para servir scripts.
NightOwl888
1
Isso é totalmente desnecessário no .NET core? Pesquisei no Google por mais ou menos uma hora e não consigo encontrar nenhuma referência de quais seriam as etapas equivalentes, então estou assumindo que simplesmente não são necessárias.
Dinerdo
35

Alguns Antecedentes

Se você abrir este arquivo:

%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config

você encontrará isso no arquivo:

<add path="WebResource.axd"
     verb="GET"
     type="System.Web.Handlers.AssemblyResourceLoader"
     validate="True" />

Isso basicamente diz ao tempo de execução do Asp.NET: "Ei, cara do asp.net, se uma solicitação vier para WebResource.axd, use AssemblyResourceLoader para processar a solicitação."

Por favor, nota que WebResource.axd não é um arquivo , mas simplesmente um mapa (se assim posso dizer) para AssemblyResourceLoader. É o nome com o qual o manipulador está registrado. Em minha máquina, encontrei os seguintes manipuladores .axd:

<add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
<add verb="*" path="*_AppService.axd" 

Ok, então o que esse manipulador faz?

O AssemblyResourceLoadersabe como procurar arquivos embutidos dentro de um assembly para que possa servi-lo (enviá-lo ao cliente, ou seja, um navegador). Por exemplo, em formulários da web do asp.net, se você usar os controles de validação, eles dependem de algum javascript para mostrar os erros na página da web. No entanto, esse javascript está embutido em uma montagem. O navegador precisa do javascript, então você verá isso no html da página:

<script src="/YourSite/WebResource.axd?d=fs7zUa...&amp;t=6342..." type="text/javascript"></script>

O AssemblyResourceLoaderirá encontrar o assembly onde o javascript está embutido usando as informações na querystring e retornar o javascript.


Voltar para a pergunta

Então, para responder à pergunta, o que é:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Isso diz ao mecanismo de roteamento que não processaremos as solicitações que correspondem a esse padrão de rota. Em outras palavras, não processaremos .axdsolicitações. Por quê? Porque o próprio MVC é um HttpHandler semelhante a .axde .aspxe muitos outros manipuladores que estão no arquivo web.config. O manipulador MVC não sabe como processar a solicitação, como procurar recursos incorporados em um assembly - ele AssemblyResourceLoadersabe como fazer isso. MVC sabe fazer, bem, tudo o que faz que está além do escopo desta pergunta e resposta.

CodingYoshi
fonte
2
Esta definitivamente com certeza deveria ser a resposta aceita, mais uma minha.
Yahya
Finalmente, uma explicação clara do que WebResource.axd realmente faz, ao mesmo tempo que fornece uma resposta clara à pergunta. Obrigado
ben_mj
18

A rota com o padrão {resource} .axd / {* pathInfo} é incluída para evitar que as solicitações dos arquivos de recursos da Web, como WebResource.axd ou ScriptResource.axd, sejam passadas para um controlador.

Leia o link: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx

Você também pode especificar que o roteamento não deve lidar com certas solicitações de URL. Você evita que o roteamento manipule certas solicitações definindo uma rota e especificando que a classe StopRoutingHandler deve ser usada para lidar com esse padrão. Quando uma solicitação é tratada por um objeto StopRoutingHandler , o objeto StopRoutingHandler bloqueia qualquer processamento adicional da solicitação como uma rota. Em vez disso, a solicitação é processada como uma página ASP.NET, serviço da Web ou outro ponto de extremidade ASP.NET. Você pode usar o método RouteCollection.Ignore (ou RouteCollectionExtensions.IgnoreRoute para aplicativos MVC) para criar rotas que usam a classe StopRoutingHandler .

Kumar Manish
fonte
7

Esses não são arquivos (eles não existem no disco) - são apenas nomes sob os quais alguns gerenciadores de HTTP são registrados.

Kumar Manish
fonte
resposta mais relevante, eu diria.
Sakthivel