Usando o roteamento do ASP.NET para servir arquivos estáticos

Roteamento ASP.Net (não MVC) pode ser usado para servir arquivos estáticos?

Digamos que eu queira encaminhar

http://sofpt.miximages.com/url-routing/picture.jpg 

para

 http://sofpt.miximages.com/url-routing/picture.jpg 

e eu quero fazê-lo dinamicamente no sentido de que a URL reescrita é computada em tempo real. Não consigo configurar uma rota estática de uma vez por todas.

De qualquer forma, posso criar uma rota como esta:

 routes.Add( "StaticRoute", new Route("static/{file}", new FileRouteHandler()) ); 

No método FileRouteHandler.ProcessRequest , posso rewrite o caminho de /static/picture.jpg para /a/b/c/picture.jpg . Eu quero então criar um manipulador para arquivos estáticos. O ASP.NET usa o StaticFileHandler para essa finalidade. Infelizmente, essa class é interna. Eu tentei criar o manipulador usando reflection e ele realmente funciona:

 Assembly assembly = Assembly.GetAssembly(typeof(IHttpHandler)); Type staticFileHandlerType = assembly.GetType("System.Web.StaticFileHandler"); ConstructorInfo constructorInfo = staticFileHandlerType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); return (IHttpHandler) constructorInfo.Invoke(null); 

Mas usar tipos internos não parece ser a solução adequada. Outra opção é implementar o meu próprio StaticFileHandler , mas fazê-lo corretamente (suportando coisas HTTP como intervalos e etags) não é trivial.

Como devo abordar o roteamento de arquivos estáticos no ASP.NET?

    Depois de analisar esse problema por algumas horas, descobri que simplesmente adicionando regras de ignorados, seus arquivos estáticos serão exibidos.

    Em RegisterRoutes (rotas RouteCollection), adicione as seguintes regras de ignorar:

     routes.IgnoreRoute("{file}.js"); routes.IgnoreRoute("{file}.html"); 

    Por que não usar o IIS para fazer isso? Você pode simplesmente criar uma regra de redirecionamento para apontar todas as solicitações da primeira rota para a segunda antes que a solicitação chegue à sua inscrição. Por causa disso, seria um método mais rápido para redirect solicitações.

    Supondo que você tenha IIS7 +, você faz algo como …

         

    Ou , se você não precisa redirect, como sugerido por @ ni5ni6:

         

    Editar 2015-06-17 para @RyanDawkins :

    E se você está se perguntando onde vai a regra de reescrita, aqui está um mapa de sua localização no arquivo web.config .

     < ?xml version="1.0" encoding="utf-8" ?>              

    Eu tive um problema semelhante. Acabei usando o HttpContext.RewritePath :

     public class MyApplication : HttpApplication { private readonly Regex r = new Regex("^/static/(.*)$", RegexOptions.IgnoreCase); public override void Init() { BeginRequest += OnBeginRequest; } protected void OnBeginRequest(object sender, EventArgs e) { var match = r.Match(Request.Url.AbsolutePath); if (match.Success) { var fileName = match.Groups[1].Value; Context.RewritePath(string.Format("/a/b/c/{0}", fileName)); } } } 

    Eu vim com uma alternativa para usar o StaticFileHandler interno. No IRouteHandler eu chamo HttpServerUtility.Transfer :

     public class FileRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { String fileName = (String) requestContext.RouteData.Values["file"]; // Contrived example of mapping. String routedPath = String.Format("/a/b/c/{0}", fileName); HttpContext.Current.Server.Transfer(routedPath); return null; // Never reached. } } 

    Isso é um hack. O IRouteHandler deve retornar um IHttpHandler e não abortar e transferir a solicitação atual. No entanto, ele realmente consegue o que eu quero.

    Usando o StaticFileHandler interno também é um pouco um hack desde que eu preciso de reflection para obter access a ele, mas pelo menos há alguma documentação sobre StaticFileHandler no MSDN tornando-se uma class um pouco mais “oficial”. Infelizmente, não acho que seja possível refletir sobre classs internas em um ambiente de confiança parcial.

    Eu vou ficar usando StaticFileHandler como eu não acho que vai ser removido do asp.net no futuro previsível.

    Você precisa adicionar TransferRequestHandler para manipular seus arquivos estáticos.Por favor, veja a seguinte resposta https://stackoverflow.com/a/21724783/22858