---
title: "Migração ASP 3.0 para .NET Core - Sistema de Rastreamento de Cargas"
slug: "asp-to-dotnet-migration"
summary: "Tech Lead na migração gradual de sistema crítico ASP 3.0 para .NET Core, com sincronização de dados entre versões e redução de custos de R$ 100k/ano em APIs de mapeamento."
client: "Empresa de Logística e Rastreamento"
industry: "Logística & Segurança"
timeline: "12 meses (migração completa)"
role: "Tech Lead & Solution Architect"
image: ""
tags:
  - ASP Classic
  - .NET Core
  - SQL Server
  - Migration
  - Tech Lead
  - OSRM
  - APIs
  - Arquitetura
featured: true
order: 2
date: 2015-06-01
seo_title: "Migração ASP 3.0 para .NET Core - Case Carneiro Tech"
seo_description: "Case de migração gradual de aplicação ASP 3.0 para .NET Core com sincronização de dados e redução de R$ 100k/ano em custos de APIs."
seo_keywords: "ASP migration, .NET Core, legacy modernization, SQL Server, OSRM, tech lead, routing API"
---

## Overview

Sistema crítico de monitoramento de cargas de alto valor (TVs LED de R$ 3.000 cada, carregamentos de até 1000 unidades) usando rastreamento GPS via satélite. A aplicação cobria todo o ciclo: desde cadastro e avaliação de motoristas (background check policial) até monitoramento em tempo real e entrega final.

**Desafio principal:** Migrar aplicação ASP 3.0 legada para .NET Core sem downtime, mantendo operação crítica 24/7.

---

## Challenge

### Sistema Legado Crítico

A empresa operava um sistema mission-critical em **ASP 3.0** (Classic ASP) que não podia parar:

**Tecnologia legada:**
- ASP 3.0 (tecnologia de 1998)
- SQL Server 2005
- Cluster failover on-premises (perfeitamente capaz de suportar a carga)
- Integração com rastreadores GPS via satélite
- Google Maps API (custo: **R$ 100.000/ano** apenas para cálculo de rotas)

**Restrições:**
- Sistema operando 24/7 com cargas de alto valor
- Impossibilidade de downtime durante migração
- Múltiplos módulos interdependentes
- Equipe precisava continuar desenvolvendo features durante a migração

---

## Solution Architecture

### Fase 1: Preparação da Infraestrutura (Meses 1-3)

#### Upgrade do Banco de Dados
```
SQL Server 2005 → SQL Server 2014
- Backup completo e validação
- Migração de stored procedures
- Otimização de índices
- Testes de performance
```

#### Estratégia de Sincronização Dual-Write

Implementei um **sistema de sincronização bidirecional** que permitia:

1. **Módulos novos (.NET Core)** gravavam no banco novo
2. **Trigger automático** sincronizava dados para o banco legado
3. **Módulos antigos (ASP 3.0)** continuavam funcionando normalmente
4. **Zero downtime** durante toda a migração

```csharp
// Exemplo de sincronização implementada
public class DualWriteService
{
    public async Task SaveDriver(Driver driver)
    {
        // Grava no banco novo (.NET Core)
        await _newDbContext.Drivers.AddAsync(driver);
        await _newDbContext.SaveChangesAsync();

        // Trigger SQL sincroniza automaticamente para banco legado
        // Módulos ASP 3.0 continuam funcionando
    }
}
```

**Por que essa abordagem?**
- Permitiu migração **módulo por módulo**
- Equipe podia continuar desenvolvendo
- Rollback simples se necessário
- Redução de risco operacional

---

### Fase 2: Migração Gradual dos Módulos (Meses 4-12)

Migrei os módulos em ordem de complexidade crescente:

**Ordem de migração:**
1. ✅ Cadastros básicos (motoristas, veículos)
2. ✅ Avaliação de risco (integração com base policial)
3. ✅ Gestão de cargas e rotas
4. ✅ Monitoramento GPS em tempo real
5. ✅ Alertas e notificações
6. ✅ Relatórios e analytics

**Stack da aplicação migrada:**
- `.NET Core 1.0` (2015-2016 era o início do .NET Core)
- `Entity Framework Core`
- `SignalR` para monitoramento real-time
- `SQL Server 2014`
- APIs RESTful

---

### Fase 3: Redução de Custos com OSRM (Economia de R$ 100k/ano)

#### Problema: Custo Proibitivo do Google Maps

A empresa gastava **R$ 100.000/ano** apenas com Google Maps Directions API para cálculo de rotas dos caminhões.

#### Solução: OSRM (Open Source Routing Machine)

Implementei uma solução baseada em **OSRM** (motor de roteamento open-source):

**Arquitetura da solução:**

```
┌─────────────────┐
│  Frontend       │
│  (Leaflet.js)   │
└────────┬────────┘
         │
         ▼
┌─────────────────┐      ┌──────────────┐
│  API Wrapper    │─────▶│  OSRM Server │
│  (.NET Core)    │      │  (self-hosted)│
└────────┬────────┘      └──────────────┘
         │
         ▼
┌─────────────────┐
│  Google Maps    │
│  (display only) │
└─────────────────┘
```

**Implementação:**

1. **OSRM Server configurado** em servidor próprio
2. **API wrapper amigável** em .NET Core que:
   - Recebia origem/destino
   - Consultava OSRM (gratuito)
   - Retornava todos os pontos da rota
   - Formatava para o frontend
3. **Frontend** desenhava a rota no Google Maps (apenas visualização, sem API de rotas)

```csharp
[HttpGet("route")]
public async Task<IActionResult> GetRoute(double originLat, double originLng,
                                           double destLat, double destLng)
{
    // Consulta OSRM (gratuito)
    var osrmResponse = await _osrmClient.GetRouteAsync(
        originLat, originLng, destLat, destLng);

    // Retorna pontos formatados para o frontend
    return Ok(new {
        points = osrmResponse.Routes[0].Geometry.Coordinates,
        distance = osrmResponse.Routes[0].Distance,
        duration = osrmResponse.Routes[0].Duration
    });
}
```

**Frontend com Leaflet:**

```javascript
// Desenha rota no mapa (Google Maps apenas para tiles)
L.polyline(routePoints, {color: 'red'}).addTo(map);
```

#### Tentativa com OpenStreetMap

Tentei substituir também o Google Maps (tiles) por **OpenStreetMap**, que funcionou tecnicamente, mas:

❌ **Usuários não gostaram** da aparência
❌ Preferiam a interface familiar do Google Maps

✅ **Decisão:** Manter Google Maps apenas para visualização (sem custo de API de rotas)

**Resultado:** Economia de **~R$ 100.000/ano** mantendo qualidade das rotas.

---

## Results & Impact

### Migração Completa em 12 Meses

✅ **100% dos módulos** migrados de ASP 3.0 para .NET Core
✅ **Zero downtime** durante toda a migração
✅ **Equipe produtiva** durante todo o processo
✅ Sistema mais rápido e escalável

### Redução de Custos

💰 **R$ 100.000/ano economizados** com substituição do Google Maps Directions API
📉 **Infraestrutura otimizada** com SQL Server 2014

### Melhorias Técnicas

🚀 **Performance:** Aplicação .NET Core 3x mais rápida que ASP 3.0
🔒 **Segurança:** Stack moderna com patches de segurança ativos
🛠️ **Manutenibilidade:** Código C# moderno vs VBScript legado
📊 **Monitoramento:** SignalR para tracking real-time mais eficiente

---

## Fase Não Executada: Microserviços & Cloud

### Planejamento Inicial

Participei do **design e concepção** da segunda fase (nunca executada):

**Arquitetura planejada:**
- Migração para **Azure** (cloud estava apenas começando em 2015)
- Quebra em **microserviços**:
  - Serviço de autenticação
  - Serviço de GPS/tracking
  - Serviço de rotas
  - Serviço de notificações
- **Event-driven architecture** com message queues

**Por que não foi executada:**

Saí da empresa logo após concluir a migração para .NET Core. A segunda fase ficou planejada mas não foi implementada por mim.

---

## Tech Stack

`ASP 3.0` `VBScript` `.NET Core 1.0` `C#` `Entity Framework Core` `SQL Server 2005` `SQL Server 2014` `OSRM` `Leaflet.js` `Google Maps` `SignalR` `REST APIs` `GPS/Satellite` `Migration Strategy` `Dual-Write Pattern`

---

## Key Decisions & Trade-offs

### Por que sincronização dual-write?

**Alternativas consideradas:**
1. ❌ Big Bang migration (muito arriscado)
2. ❌ Manter tudo em ASP 3.0 (insustentável)
3. ✅ **Migração gradual com sync** (escolhido)

**Justificativa:**
- Sistema crítico não podia parar
- Permitiu rollback módulo por módulo
- Equipe continuou produtiva

### Por que OSRM em vez de outros?

**Alternativas:**
- Google Maps: R$ 100k/ano ❌
- Mapbox: Licença paga ❌
- GraphHopper: Configuração complexa ❌
- **OSRM: Open-source, rápido, configurável** ✅

### Por que não OpenStreetMap para tiles?

**Decisão baseada em UX:**
- Tecnicamente funcionou perfeitamente
- Usuários preferiam interface familiar do Google
- **Compromisso:** Google Maps para visualização (grátis) + OSRM para rotas (grátis)

---

## Lessons Learned

### 1. Migração Gradual > Big Bang

Migrar módulo por módulo com sincronização permitiu:
- Aprendizado contínuo
- Ajustes de rota durante o processo
- Confiança da equipe e stakeholders

### 2. Open Source Pode Economizar Muito

OSRM economizou **R$ 100k/ano** sem perda de qualidade. Mas requer:
- Expertise para configurar
- Infraestrutura própria
- Manutenção contínua

### 3. UX > Tecnologia às Vezes

OpenStreetMap era tecnicamente superior (gratuito), mas usuários preferiram Google Maps. **Lição:** Ouvir os usuários finais.

### 4. Planeje Cloud, mas Valide o ROI

Em 2015, cloud estava começando. A infraestrutura on-premises (cluster SQL Server) era perfeitamente capaz. **Não force cloud se não há benefício claro.**

---

## Context: Por que 2015 foi um Momento Especial?

**Estado da tecnologia em 2015:**

- ☁️ **Cloud engatinhando:** AWS existia, Azure crescendo, mas adoção corporativa ainda baixa
- 🆕 **.NET Core 1.0 lançado** em junho/2016 (usamos RC durante projeto)
- 📱 **Microserviços:** Conceito novo, Docker em adoção inicial
- 🗺️ **Google Maps dominante:** APIs pagas, poucas alternativas open-source maduras

**Desafios da época:**
- Ferramentas de migração ASP→.NET inexistentes
- Documentação .NET Core escassa (versão 1.0!)
- Padrões de arquitetura ainda se consolidando

Este projeto foi **pioneiro** ao adotar .NET Core logo no início, quando a maioria migrava para .NET Framework 4.x.

---

**Resultado:** Migração bem-sucedida de sistema crítico 24/7, economia de R$ 100k/ano, e base sólida para evolução futura.

[Quer discutir uma migração similar? Entre em contato](#contact)
