Welcome to GASP Sign in | Join | Help

Paulo Morgado

Tudo sobre Arquitectura de Software
Fazendo Com Que PathInfo E ASP.NET Themes Coexistam

Actualizdo em 2008.07.28 – O código tinha sido feito à pressa e, falando com o meu amigo Luís, verifiquei que me tinha esquecido de fazer a comparação ignorando a caixa dos caracteres e o código não era muito óbvio. Portanto, actualizei o código e adicionei uma pequena explicação.

Na minha última entrada escrevi acerca dos problemas que ocorrem quando tentamos usar path infos em conjunto com ASP.NET Themes and Skins.

Mas, tal como na maioria das vezes, não estamos interessados no porque não podemos. Apenas queremos saber como podemos.

Na minha opinião, a forma correcta de o fazer seria usar URLs referenciados a partir da raíz.

Mas como não o podemos fazer, a segunda melhor hipótese será servir correctamente os pedidos erradamente endereçados.

Mas, como o poderemos fazer?

A única solução que arranjei foi um Módulo HTTP:

public class AppThemesModule : global::System.Web.IHttpModule
{
    private const string LocalThemesFolderName = "/App_Themes/";
    private static readonly int searchStartIndex;
    private static readonly int minimumLenghtForSearch;

    static AppThemesModule()
    {
        int searchStartIndex = System.Web.HttpRuntime.AppDomainAppVirtualPath.Length;

        AppThemesModule.searchStartIndex = ((searchStartIndex == 1) ? 0 : searchStartIndex) + 2;

        AppThemesModule.minimumLenghtForSearch = AppThemesModule.searchStartIndex + AppThemesModule.LocalThemesFolderName.Length;
    }

    #region IHttpModule Members

    public void Dispose()
    {
    }

    public void Init(System.Web.HttpApplication context)
    {
        context.BeginRequest += HttpApplicationBeginRequest;
    }

    #endregion

    void HttpApplicationBeginRequest(object sender, System.EventArgs e)
    {
        System.Web.HttpApplication httpApplication = sender as System.Web.HttpApplication;

        string path = httpApplication.Request.Path;
        if (path.Length > searchStartIndex)
        {
            int appThemesStartIndex = path.IndexOf(AppThemesModule.LocalThemesFolderName, searchStartIndex, System.StringComparison.OrdinalIgnoreCase);
            if (appThemesStartIndex > 0)
            {
                httpApplication.Context.RewritePath("~" + path.Substring(appThemesStartIndex));
            }
        }
    }
}

O código começa por inicializar o campo estático apenas de leitura searchStartIndex com o índice inicial de pesquisa do padrão with /App_Themes/. Se o comprimento do caminho virtual da aplicação for 1, quer dizer que se trata da raíz do sítio e o índice inicial de pesquisa será 0 e vez de 1; caso contrário o índice inicial de pesquisa corresponderá ao comprimento do caminho virtual da aplicação. É adicionado 2 porque não há necessidade de iniciar a pesquisa logo a seguir ao caminho virtual da aplicação (se o padrão fosse encontrado logo a seguir ao caminho virtual da aplicação, não seria necessária qualquer substituição).

Em seguida, o campo estático apenas de leitura minimumLenghtForSearch é inicializado com o comprimento mínimo que o caminho virtual terá de ter para que seja efectuada uma pesquisa pelo padrão. Não há necessidade de pesquisar pelo padrão se o comprimento total do caminho virtual for inferior ao comprimento do caminho virtual da aplicação acrescido do comprimento do padrão.

Além de registar o móduilo será necessário configurar o directório virtual para que os pedidos para conteúdos a serem servidos dos temas sejam tratados por um StaticFileHandler.

Posted: Thursday, July 24, 2008 1:23 AM by Paulo Morgado

Comments

Paulo Morgado said:

Na minha última entrada apresentei uma solução para os problemas que ocorrem quando tentamos usar path

# July 25, 2008 1:24 AM

Paulo Morgado said:

# July 25, 2008 1:25 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS