Dominio .ms e HttpHandler
Bruno Kenj | ASP.NET
Dia 20/09, quinta, estava navegando pelo GoDaddy.com para renovar um domínio quando vejo uma daquelas propagandas oferecendo desconto no registro de novos domínios. Acabei registrando o domínio brunokenj.ms. Conheci esse dominio através do popfly.ms e refere-se a Montserrat, uma pequena colônia britânica do Caribe. Além do .ms, outro dominio bem interessante é o .mobi por apenas 10U$, pois já estamos com 2.2 bilhões de telefones e o Windows Mobile 6 saindo!
Depois de registrado, modifiquei o name server e adicionei os ponteiros, pronto. Quando acessava brunokenj.ms estava acessando a mesma aplicação que o dominio brunokenj.net.
O problema é que a página (default) apenas direcionava para um endereço específico. Nesse caso, ao acessar, a pessoa é direcionada para o blog do dominio .NET e o ideal seria que se ela acessou pelo dominio .MS, que continue nele.
Código da página Default.aspx
<html> <head> <title>Bruno Kenj .NET</title> <meta HTTP-EQUIV="REFRESH" content="0; url=http://www.brunokenj.net/blog/"> </head> </html>
Como resolver então?
Uma maneira bem simples foi utilizar customizar o HttpHandler para essa tarefa. Como não tive tempo de escrever sobre modules e handlers, aqui vai um excelente artigo escrito pelo Israel Aéce (MVP ASP.NET) “ASP.NET INTERNALS“.
A idéia foi simplismente adicionar na aplicação Web um HttpHandler chamado RedirectHandler, onde vamos sobrescrever o método ProcessRequest que recebe o objeto HttpContext, para recuperarmos o host acessado pelo usuário e adicionar o caminho definido, neste caso, /blog/.
RedirectHandler
Adicionei a classe RedirectHandler dentro da pasta App_Code da solução.
using System; using System.Web; using System.Configuration; /// <summary> /// Summary description for RedirectHandler /// </summary> public class RedirectHandler : IHttpHandler { /// <summary> /// Implementação do Handler sobrescrevendo o método ProcessResquest /// </summary> /// <param name="context"></param> public void ProcessRequest(HttpContext context) { // Formata a nova URL, direcionando para o host acessado mais o caminho inicial definido. // ex: http:// + host + /blog/ String urlRedirect = ConfigurationManager.AppSettings["urlRedirect"]; String novaURL = string.Format("http://{0}{1}", context.Request.Url.Host, urlRedirect); // Faz o redirecionamento de acordo com a nova URL context.Response.Redirect(novaURL, true); } /// <summary> /// Gets a value indicating whether another request can use the IHttpHandler instance. /// </summary> public bool IsReusable { get { return true; } } }
appSettings no arquivo Web.Config
<appSettings> <add key="urlRedirect" value="/blog/" /> </appSettings>
httpHandlers no System.Web no arquivo Web.Config
<system.web> <httpHandlers> <add verb="*" path="Default.aspx" type="RedirectHandler" /> </httpHandlers> </system.web>
Nesse caso, nem foi mais necessário os atributos HTTP-EQUIV e CONTENT. Não existe nenhum código adicional no Default.aspx, apenas a nova saída através do handler. Agora, ao acessar brunokenj.ms ou brunokenj.net (arquivo padrão Default.aspx), é feito um redirecionamento para o dominio que acessou + /blog/. Poderia forçar aqui o endereço sempre ter garantir o www, ou não.
Neste cenário específico, eu apenas quero redirecionar a pessoa para o blog, já que não estou com nenhuma aplicação principal. Isso só foi uma pequena demonstração de como o pipeline do ASP.NET é bem definido e extensível.
abraços,