Wednesday, October 28, 2026

Lessons Learned Migrating Legacy .NET Applications to Azure

Many organizations are under pressure to modernize aging .NET applications while minimizing business disruption. After leading and supporting several modernization initiatives, I've learned that cloud migration is rarely just a technology challenge. Success depends on architecture, security, governance, processes, and people.

Why Modernization Matters

Legacy applications often become difficult to maintain, expensive to scale, and slow to adapt to changing business needs. Azure offers opportunities to improve scalability, reliability, security, and deployment speed, but simply moving workloads to the cloud does not automatically deliver these benefits.

The goal should be modernization, not just migration.



Lesson 1: Avoid a "Lift and Shift" Mindset

One of the most common mistakes is treating Azure as another datacenter.

Moving applications to Azure Virtual Machines may reduce migration risk, but it often carries existing technical debt into the cloud.

Instead, consider:

  • Azure App Services for web applications
  • Azure SQL Managed Instance or Azure SQL Database
  • Containerizing suitable workloads
  • Azure Functions for background processing

Modernization should improve architecture, not just change where applications run.

Lesson 2: Start with Business Priorities

Not every application requires the same level of modernization.

Before selecting Azure services, ask:

  • Which applications deliver the most business value?
  • Which systems struggle with scalability?
  • Which applications generate the highest operational costs?
  • Which systems are most important to customers?

Prioritizing business outcomes often delivers greater value than focusing only on technical complexity.

Lesson 3: Design Security from the Beginning

Security should be part of the architecture from day one.

Key areas to consider include:

  • Microsoft Entra ID integration
  • Managed Identities
  • Azure Key Vault
  • Role-Based Access Control (RBAC)
  • Network segmentation
  • Private Endpoints

Building security in early is much easier than adding it later.

Lesson 4: Modernize Data Carefully

Applications are usually easier to migrate than data.

Common challenges include:

  • Data quality issues
  • Hidden dependencies
  • Performance bottlenecks
  • Limited migration windows

Successful teams invest in:

  • Data profiling
  • Performance testing
  • Migration rehearsals
  • Rollback planning

In many migrations, the database strategy determines overall success.

Lesson 5: Establish CI/CD Early

Cloud modernization and manual deployments do not work well together.

Before migrating critical workloads:

  • Implement source control standards
  • Build automated pipelines
  • Automate infrastructure provisioning
  • Define deployment approval processes

Azure DevOps and GitHub Actions can reduce deployment risk while improving delivery speed.

Lesson 6: Monitor Everything

Many organizations realize after migration that they lack visibility into application health and performance.

A strong Azure monitoring strategy should include:

  • Application Insights
  • Azure Monitor
  • Log Analytics
  • Distributed tracing
  • Performance dashboards
  • Proactive alerting

Observability should be treated as a core requirement, not an afterthought.

Lesson 7: Design for Failure

Cloud platforms are highly reliable, but failures still happen.

Applications should assume that:

  • Services may become unavailable
  • Network latency may increase
  • Dependencies may fail unexpectedly

Design patterns such as:

  • Retry policies
  • Circuit breakers
  • Queue-based processing
  • Graceful degradation

help improve resiliency and user experience.

Lesson 8: Manage Costs from Day One

A common misconception is that cloud automatically lowers costs.

Without proper governance, costs can increase quickly.

Recommended practices include:

  • Resource tagging standards
  • Budget alerts
  • Reserved Instances where appropriate
  • Autoscaling strategies
  • Regular cost reviews

Cost optimization should be an ongoing discipline.

Lesson 9: Organizational Change Matters

Technology alone does not guarantee success.

Successful modernization requires:

  • Executive sponsorship
  • Cross-functional collaboration
  • Training and upskilling
  • Updated operational processes
  • Clear ownership and accountability

The most successful programs evolve people and processes alongside technology.

Lesson 10: Think Platform, Not Projects

Organizations gain the most value when they build reusable cloud foundations.

These foundations often include:

  • Landing zones
  • Security standards
  • CI/CD templates
  • Monitoring frameworks
  • Governance policies

Investing in these capabilities once helps future migrations move faster and more consistently.

Final Thoughts

Migrating legacy .NET applications to Azure is more than a hosting decision. It is an opportunity to improve scalability, security, operational efficiency, and business agility.

The most successful modernization efforts balance technology, process, and people while staying focused on business outcomes.

Moving to Azure is just the beginning. The real value comes from improving architecture, security, operations, and the way teams work together.

Friday, November 27, 2020

SQL Server - Identify unused indexes

 In this blog, we learn about the index usage information (SYS.DM_DB_INDEX_USAGE_STATS) and analyze the index usage data (USER_SEEKS, USER_SCANS, USER_LOOKUPS, USER_UPDATES) and will identify the unused index.

Indexes help us in covering and enhancing the performance of a large number of queries that try to retrieve data from the database table and SQL Server allows us to create up to 999 Non-clustered indexes and one Clustered indexes per each table and there is a Meta data table SYS.INDEXESwhich contains one row per each index in table or view.

 

SQL server stores the index usage information in the system table and it provides SYS.DM_DB_INDEX_USAGE_STATSview to access the index usage statistics information so with help of index usage information we can identify the un-used index and will remove them easily.

 

there are few important columns (USER_SEEKS, USER_SCANS, USER_LOOKUPS, USER_UPDATES) in SYS.DM_DB_INDEX_USAGE_STATSthat help us to identify the bad or un-used index in table which are not being used in any query but in each update /insert operations , index data is getting updated.

 

·        USER_SEEKS - it stores the number of times the index is used to find a specific row.

·        USER_SCANS - it stores the number of times the leaf pages of the index are scanned.

·        USER_LOOKUPS - it stores the number of times a Clustered index is used by the Non-clustered index to fetch the full row .

·        USER_UPDATES - it stores the number of times the index data is modified

 

Here is a SQL query to pull the above information about the index.

 

SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],

       I.[NAME] AS [INDEX NAME],

       USER_SEEKS,

       USER_SCANS,

       USER_LOOKUPS,

       USER_UPDATES         

FROM  SYS.DM_DB_INDEX_USAGE_STATS AS S

       INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID]= S.[OBJECT_ID] AND I.INDEX_ID = S.INDEX_ID

WHERE OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable')=1

      AND S.database_id=DB_ID()

      AND I.name='OrderOrderStatusDate_IDX'

 

Output:

SYS.DM_DB_INDEX_USAGE_STATS



 


As per output, the sql index “OrderOrderStatusDate_IDX” is not being used but index data is modified by 28046 times. 

Saturday, October 31, 2020

SSRS : How to bold a row in RDLC report by conditionally

In this blog, we will learn how to change a row font to Bold in rdlc report on specific condition.

In daily summary leads report, I want to change total row font to Bold.

SSRS RDLC Report

 

·        Select Data Row in RDLC report

SSRS RDLC Data row

·        In Property window,  expend the font property and select the FontWeight field, and select the Expression from list.

SSRS RDLC Property Font

 

·        In Edit Expression window, use the data set field to create a conditional statement to change row font.

 

=IIf(Fields!Date.Value="Total","Bold","Default")

 

SSRS RDLC Property Expression

 

After changes, Total row in report is bold

 

SSRS Report RDLC

 

Lessons Learned Migrating Legacy .NET Applications to Azure

Many organizations are under pressure to modernize aging .NET applications while minimizing business disruption. After leading and supportin...