Até agora não havia uma forma de configurar o ASP.Net Routing com o Web.config (ao menos que eu soubesse). Até agora, fazia-se assim:

Public Class GlobalApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

         MapRoute takes the following parameters, in order:
         (1) Route name
         (2) URL with parameters
         (3) Parameter defaults
        routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

Então fiz algo aqui para ajudar. Criei um assembly para permitir a configuração. No web.config fica assim:

  <gb.aspnetrouting>
    <routing>

      <routes>
        <!--<route routeName="name of the route" 
           url="the url" 
           routeHandler="some 
           route handler" />-->
        <route routeName="DefaultMvc" 
           url="{controller}/{action}/{id}" 
           routeHandler="MvcRouteHandler">
          <defaults>
            <default name="action" value="index" 
               type="System.String, mscorlib"/>
            <default name="id" value="" 
               type="System.String, mscorlib"/>
          </defaults>
          <constraints>
            <constraint name="basic" 
               value="[^\.]*" 
               type="System.String, mscorlib"/>
          </constraints>
          <dataTokens>
            <dataToken name="someData" 
            value="I'm a data token" type="System.String, mscorlib"/>
          </dataTokens>
        </route>
      </routes>

      <ignoredRoutes>
        <ignoredRoute url="{resource}.axd/{*pathInfo}" />
      </ignoredRoutes>

      <routeHandlers>
        <routeHandler name="MvcRouteHandler" 
           type="System.Web.Mvc.MvcRouteHandler, System.Web.Mvc"/>
      </routeHandlers>

    </routing>
  </gb.aspnetrouting>

E no Global.asax, fica assim:

Public Class GlobalApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

        GB.RoutingConfig.RoutingConfiguration.Configure( _
           "~/web.config", routes)

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

 

No Global.asax existe apenas uma chamada ao método de configuração. Tirei a idéia do que já existe hoje no .Net Remoting, que possui chamada de configuração semelhante.

Já no web.config, você pode configurar as rotas, com Constraints, Defaults e DataTokens, o gerenciador de rota (que no MVC é sempre o MvcRouteHandler), e as rotas ignoradas. Até o time do MVC lançar o deles vou usar esse para ajudar. E parece que vai ser bem para frente, já que eles já disseram que vão focar em features, por enquanto.

Quem quiser baixar, pegue aqui a dll compilada, e aqui o código fonte. Fiquem à vontade para melhorar, e me dêem notícia se funcionou para vocês e se gostaram.

Já adianto que não é o assembly mais testado no mundo, então ele tem somente a seguinte garantia: "roda na minha máquina". Espero que na de vocês também rode, e deve rodar, mas não garanto que está livre de bugs, já que foi mais um exercício do que a construção de um módulo, ok?


Postado na(s) categoria(s) ASP.Net Routing pelo giovanni bassi em 20 de julho de 2008 às 22:50 | Tags: ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Acabo de testar o novo OutputCache do ASP.Net MVC Preview 4. Notei que ele não tem uma forma de configurar uma dependência de Cache com SQL, nem mesmo via perfil de cache (Cache profile). De resto, funciona perfeitamente.

Para confirmar criei um projeto de testes e analisei um pouco mais a fundo. Dêem uma olhada como ficou meu Web.config abaixo.

Primeiro a seção de strings de conexão:

  <connectionStrings>
    <add name="Northwind2005ConnectionString" 
    connectionString="data source=gb2;Initial Catalog=Northwind2005;User ID=user;password=pwd" providerName="System.Data.SqlClient"/>
  </connectionStrings>

E agora seção de cache:

     <caching>
      <sqlCacheDependency enabled="true">
        <databases>
          <add name="Northwind2005" 
          connectionStringName="Northwind2005ConnectionString" 
          pollTime="10000"/>
        </databases>
      </sqlCacheDependency>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="NorthwindCacheProfile" varyByParam="none" 
          sqlDependency="Northwind2005:Employees" 
          enabled="true" duration="600"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>

Tudo configurado corretamente. Se você aplicar esse xml no seu web.config para trabalhar com web forms e aplicar um diretiva de @OutputCache na página vai funcionar.

No ASP.Net MVC funciona assim: você cria uma ação, e coloca o atributo de OutputCache. Para testar, criei um controlador de cache, e duas ações, a padrão, Index, e outra, para testar a interação com a dependência SQL, que usa a mesma View. Vejam como ficou:

namespace MvcApplication1.Controllers
{
    public class CacheTestController : Controller
    {
        [OutputCache(Duration=10)]
        public ActionResult Index()
        {
            ViewData["mensagem"] = "Última atualização às " 
            + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
            return View();
        }

        [OutputCache(CacheProfile = "NorthwindCacheProfile")]
        public ActionResult SQLCacheDep()
        {
            ViewData["mensagem"] = "(SQL Dep) Última atualização às " 
            + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
            return View("Index");
        }
    }
}

A primeira funciona ok. A segunda resulta em um cache que só expira quando a duração é alcançada, ou seja, em 10 minutos (600 segundos). Abri um SQL Profiler e constatei: nada acontecendo lá, nenhuma conexão vindo da aplicação. Se fosse Web Forms estaria rodando a procedure “AspNet_SqlCachePollingStoredProcedure” para ver se alguma coisa mudou.

Para terminar, confirmei no código fonte do ASP.Net MVC a classe OutputCacheAttribute. Ela tem uma função chamada ApplyProfile, onde ela aplica os dados do Cache Profile, vejam só:

public void ApplyProfile(OutputCacheProfile profile) {
    Duration = profile.Duration;
    Location = profile.Location;
    NoStore = profile.NoStore;
    VaryByContentEncoding = profile.VaryByContentEncoding;
    VaryByCustom = profile.VaryByCustom;
    VaryByHeader = profile.VaryByHeader;
    VaryByParam = profile.VaryByParam;
}

Percebem como ela não aplica a propriedade “SqlDependency” do profile? Taí a explicação. O profile está sendo aplicado só com a duração configurada para expirar (propriedade duration), mais nada.

Imagino que a implementação deve sair no Preview 5, vamos ver.


Postado na(s) categoria(s) ASP.Net MVC pelo giovanni bassi em 20 de julho de 2008 às 14:24 | Tags:

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Gerencio uma fábrica de software, gosto muito de arquitetura e engenharia de software, publico artigos e edito a .Net Magazine. Dou umas palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Selos

Web Days 2008

MCPD

MCSD

.Net Magazine

Calendário

«  julho 2008  »
seteququsedo
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Ver detalhamento de posts no calendário

Postagens recentes

Comentários recentes

Disclaimer / Aviso
As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

© Copyright 2008 .Net Unplugged
Sign in