@azure/mcp-win32-x64
Version:
Azure MCP Server - Model Context Protocol implementation for Azure, for win32 on x64
191 lines (155 loc) • 9.55 kB
Markdown
---
title: Classic ASP.NET 2.x to 3.x Migration
category: migration
applies-to: 3.x
---
# Classic ASP.NET 2.x → 3.x Code Migration
## What changed
3.x is built on OpenTelemetry internally. The NuGet package name stays the same — `Microsoft.ApplicationInsights.Web` — but the internal architecture changed. `applicationinsights.config` format is simplified, satellite packages are removed, and extensibility uses OpenTelemetry processors via `ConfigureOpenTelemetryBuilder`.
Key changes:
- `<InstrumentationKey>` → `<ConnectionString>` (connection string is **required** — 3.x throws without it)
- `<TelemetryInitializers>`, `<TelemetryModules>`, `<TelemetryProcessors>` sections → removed entirely
- `<TelemetryChannel>` section → removed (export managed by OpenTelemetry)
- 12 satellite packages → removed (functionality built into the main package)
- `TelemetryConfiguration.Active` → `TelemetryConfiguration.CreateDefault()` (returns static singleton in 3.x)
- Minimum .NET Framework: 4.5.2 → **4.6.2**
- Custom initializers/processors → OpenTelemetry processors via `ConfigureOpenTelemetryBuilder`
## applicationinsights.config — before / after
**2.x:**
```xml
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<InstrumentationKey>00000000-0000-0000-0000-000000000000</InstrumentationKey>
<TelemetryInitializers>
<Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web">
<Filters>search|spider|crawl|Bot|Monitor</Filters>
</Add>
<!-- ... more initializers ... -->
</TelemetryInitializers>
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector" />
<!-- ... more modules ... -->
</TelemetryModules>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel">
<DeveloperMode>false</DeveloperMode>
</TelemetryChannel>
</ApplicationInsights>
```
**3.x:**
```xml
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<ConnectionString>InstrumentationKey=...;IngestionEndpoint=https://dc.applicationinsights.azure.com/</ConnectionString>
<TracesPerSecond>5.0</TracesPerSecond>
<EnableTraceBasedLogsSampler>true</EnableTraceBasedLogsSampler>
<EnableQuickPulseMetricStream>true</EnableQuickPulseMetricStream>
<EnablePerformanceCounterCollectionModule>true</EnablePerformanceCounterCollectionModule>
<EnableDependencyTrackingTelemetryModule>true</EnableDependencyTrackingTelemetryModule>
<EnableRequestTrackingTelemetryModule>true</EnableRequestTrackingTelemetryModule>
<AddAutoCollectedMetricExtractor>true</AddAutoCollectedMetricExtractor>
</ApplicationInsights>
```
## Web.config changes
**Remove** `TelemetryCorrelationHttpModule` (OpenTelemetry handles correlation natively).
**Keep** `ApplicationInsightsHttpModule` — still needed in 3.x.
**Add** `TelemetryHttpModule` (from `OpenTelemetry.Instrumentation.AspNet`) — added automatically by NuGet install.
## Satellite packages to remove
These packages are no longer needed — their functionality is built into `Microsoft.ApplicationInsights.Web` 3.x. **Remove in this order** (dependents before dependencies):
1. `Microsoft.ApplicationInsights.WindowsServer`
2. `Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel`
3. `Microsoft.ApplicationInsights.DependencyCollector`
4. `Microsoft.ApplicationInsights.PerfCounterCollector`
5. `Microsoft.ApplicationInsights.Agent.Intercept`
6. `Microsoft.AspNet.TelemetryCorrelation`
Also remove if present (skip any not in packages.config):
- `Microsoft.ApplicationInsights.EventCounterCollector`
- `Microsoft.Extensions.Logging.ApplicationInsights`
- `Microsoft.ApplicationInsights.Log4NetAppender`
- `Microsoft.ApplicationInsights.TraceListener`
- `Microsoft.ApplicationInsights.DiagnosticSourceListener`
- `Microsoft.ApplicationInsights.EtwCollector`
- `Microsoft.ApplicationInsights.EventSourceListener`
## TelemetryConfiguration changes
| 2.x Pattern | 3.x Replacement |
|---|---|
| `TelemetryConfiguration.Active` | `TelemetryConfiguration.CreateDefault()` (returns static singleton) |
| `new TelemetryConfiguration(ikey)` | `TelemetryConfiguration.CreateDefault()` + set `ConnectionString` |
| `config.InstrumentationKey = "..."` | `config.ConnectionString = "InstrumentationKey=...;IngestionEndpoint=..."` |
| `config.TelemetryInitializers.Add(...)` | Use `ConfigureOpenTelemetryBuilder` — see below |
| `config.TelemetryProcessorChainBuilder` | Use `ConfigureOpenTelemetryBuilder` — see below |
| `config.TelemetryChannel` | Removed — export managed by OpenTelemetry |
| `config.TelemetrySinks` | Removed — use OpenTelemetry exporters |
## Custom processor migration (non-DI)
In classic ASP.NET, use `ConfigureOpenTelemetryBuilder` on `TelemetryConfiguration` in `Global.asax.cs`:
```csharp
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using OpenTelemetry.Trace;
using OpenTelemetry.Logs;
using OpenTelemetry.Resources;
public class MvcApplication : HttpApplication
{
public static TelemetryClient TelemetryClient { get; private set; }
protected void Application_Start()
{
var config = TelemetryConfiguration.CreateDefault();
config.ConnectionString = "InstrumentationKey=...;IngestionEndpoint=...";
config.ConfigureOpenTelemetryBuilder(otel =>
{
otel.WithTracing(tracing =>
{
tracing.AddProcessor<MyEnrichmentProcessor>();
tracing.AddProcessor<MyFilterProcessor>();
});
otel.ConfigureResource(r => r.AddService("MyWebApp"));
});
TelemetryClient = new TelemetryClient(config);
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
protected void Application_End()
{
TelemetryClient?.Flush();
System.Threading.Tasks.Task.Delay(1000).Wait();
}
}
```
> **Important:** Create a **single static** `TelemetryClient` instance in `Application_Start`. Do not create per-request or per-controller instances — this causes memory leaks and duplicate telemetry. `TelemetryConfiguration.CreateDefault()` returns a singleton that is shared with the `ApplicationInsightsHttpModule`.
See TelemetryConfigurationBuilder.md for full API details.
## Sampling changes
- Per-type sampling (e.g. exclude exceptions from sampling) is **no longer supported**
- Default: rate-limited at 5 traces/sec via `<TracesPerSecond>`
- Fixed-rate: `<SamplingRatio>0.25</SamplingRatio>` (25%)
- Custom OTel samplers not supported with 3.x shim
## TelemetryClient changes
See TelemetryClient.md for full breaking changes. Key items:
- `TrackPageView` — removed entirely
- `TrackEvent`/`TrackException`/`TrackAvailability` — metrics dict parameter removed
- Parameterless `new TelemetryClient()` — removed, use `new TelemetryClient(TelemetryConfiguration.CreateDefault())`
- `client.InstrumentationKey` — removed
- Create a **single static instance** — do not create per-request (see processor migration section above)
## Migration steps
1. Check .NET Framework target — must be **4.6.2** or later
2. Upgrade `Microsoft.ApplicationInsights.Web` to 3.x via Package Manager Console: `Update-Package Microsoft.ApplicationInsights.Web`
3. Remove satellite packages via Package Manager Console in this order (dependents before dependencies):
- `Microsoft.ApplicationInsights.WindowsServer`
- `Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel`
- `Microsoft.ApplicationInsights.DependencyCollector`
- `Microsoft.ApplicationInsights.PerfCounterCollector`
- `Microsoft.ApplicationInsights.Agent.Intercept`
- `Microsoft.AspNet.TelemetryCorrelation`
4. Rewrite `applicationinsights.config` to 3.x format (remove all `<TelemetryInitializers>`, `<TelemetryModules>`, `<TelemetryProcessors>`, `<TelemetryChannel>` sections; add `<ConnectionString>` and feature flags)
5. Update `Web.config` — remove `TelemetryCorrelationHttpModule`, verify `TelemetryHttpModule` present
6. Replace `TelemetryConfiguration.Active` with `TelemetryConfiguration.CreateDefault()` in code
7. Create a single static `TelemetryClient` in `Application_Start`, flush in `Application_End`
8. Migrate custom `ITelemetryInitializer`/`ITelemetryProcessor` to OpenTelemetry processors via `ConfigureOpenTelemetryBuilder`
9. Fix TelemetryClient breaking calls (TrackEvent metrics dict, TrackPageView, etc.)
10. Set `<ConnectionString>` in applicationinsights.config
11. Build and verify
## See also
- ApplicationInsightsWeb API reference(see in ApplicationInsightsWeb.md)
- ConfigureOpenTelemetryBuilder(see in TelemetryConfigurationBuilder.md)
- TelemetryClient breaking changes(see in TelemetryClient.md)