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 rotear
http://domain.tld/static/picture.jpg
para
http://domain.tld/a/b/c/picture.jpg
e eu quero fazer isso 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())
);
NoFileRouteHandler.ProcessRequest
método eu posso reescrever 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 oStaticFileHandler
para este fim. Infelizmente, essa classe é interna. Eu tentei criar o manipulador usando reflexão 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óprioStaticFileHandler
, mas fazê-lo corretamente (suporte HTTP coisas como intervalos e etags) é não-trivial.
Como devo abordar o roteamento de arquivos estáticos no ASP.NET?