Dominio .ms e HttpHandler

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,

Leave a Reply