MyCSharp.HttpUserAgentParser 3.1.3

MyCSharp.HttpUserAgentParser

Fast HTTP User-Agent parsing for .NET.

Repository: https://github.com/mycsharp/HttpUserAgentParser

Install

dotnet add package MyCSharp.HttpUserAgentParser

Quick start (no DI)

string userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36";
HttpUserAgentInformation info = HttpUserAgentParser.Parse(userAgent);
// or: HttpUserAgentInformation.Parse(userAgent)

Dependency injection

If you want to inject a parser (e.g., in ASP.NET Core), use IHttpUserAgentParserProvider.

No cache

services
	.AddHttpUserAgentParser();

ConcurrentDictionary cache

services
	.AddHttpUserAgentCachedParser();
// or: .AddHttpUserAgentParser<HttpUserAgentParserCachedProvider>();

Telemetry (EventCounters)

Telemetry is:

  • Opt-in: disabled by default (keeps hot path overhead-free)
  • Low overhead: counters are only written when a listener is attached

Enable telemetry (Fluent API)

services
	.AddHttpUserAgentParser()
	.WithTelemetry();

EventSource + counters

EventSource: MyCSharp.HttpUserAgentParser (constant: HttpUserAgentParserEventSource.EventSourceName)

  • parse.requests (incrementing)
  • parse.duration (ms, event counter)
  • cache.hit (incrementing)
  • cache.miss (incrementing)
  • cache.size (polling)

Monitor with dotnet-counters

dotnet-counters monitor --process-id <pid> MyCSharp.HttpUserAgentParser

Telemetry (native Meters)

In addition to EventCounters, this package can emit native System.Diagnostics.Metrics instruments.

Telemetry is:

  • Opt-in: disabled by default (keeps hot path overhead-free)
  • Low overhead: measurements are only recorded when enabled

Enable meters (Fluent API)

services
	.AddHttpUserAgentParser()
	.WithMeterTelemetry();

Meter + instruments

Meter: MyCSharp.HttpUserAgentParser (constant: HttpUserAgentParserMeters.MeterName)

  • parse.requests (counter)
  • parse.duration (histogram, ms)
  • cache.hit (counter)
  • cache.miss (counter)
  • cache.size (observable gauge)

Export to OpenTelemetry

You can collect these EventCounters via OpenTelemetry metrics and export them (OTLP, Prometheus, Azure Monitor, …).

Packages you typically need:

  • OpenTelemetry
  • OpenTelemetry.Exporter.OpenTelemetryProtocol (or another exporter)
  • OpenTelemetry.Instrumentation.EventCounters

Example (minimal):

using OpenTelemetry.Metrics;
using MyCSharp.HttpUserAgentParser.Telemetry;

builder.Services.AddOpenTelemetry()
	.WithMetrics(metrics =>
	{
		metrics
			.AddEventCountersInstrumentation(options =>
			{
				options.AddEventSources(HttpUserAgentParserEventSource.EventSourceName);
			})
			.AddOtlpExporter();
	});

If you also use the MemoryCache/AspNetCore packages, add their EventSource names too.

Export native meters to OpenTelemetry

If you enabled native meters (see above), collect them via AddMeter(...):

using OpenTelemetry.Metrics;
using MyCSharp.HttpUserAgentParser.Telemetry;

builder.Services.AddOpenTelemetry()
	.WithMetrics(metrics =>
	{
		metrics
			.AddMeter(HttpUserAgentParserMeters.MeterName)
			.AddOtlpExporter();
	});

Export to Application Insights

There are two common approaches:

Collect with OpenTelemetry (see above) and export to Azure Monitor / Application Insights using an Azure Monitor exporter. This keeps your pipeline consistent and avoids custom listeners.

Typical packages (names may differ by version):

  • OpenTelemetry
  • OpenTelemetry.Instrumentation.EventCounters
  • Azure.Monitor.OpenTelemetry.Exporter

2) Custom EventListener → TelemetryClient

If you prefer a direct listener, you can attach an EventListener and forward values as custom metrics.

High-level idea:

  • Enable the EventSource
  • Parse the EventCounters payload
  • Track as Application Insights metrics

Notes:

  • This is best-effort telemetry (caches can race)
  • Keep aggregation intervals reasonable (e.g. 10s)

Showing the top 20 packages that depend on MyCSharp.HttpUserAgentParser.

Packages Downloads
Volo.Abp.AspNetCore
Package Description
1

Version Downloads Last updated
3.1.3 1 03/29/2026
3.0.28 0 08/25/2025
3.0.27 0 08/23/2025
3.0.25 0 04/26/2025
3.0.23 0 04/12/2025
3.0.13 0 02/25/2025
3.0.12 0 02/25/2025
3.0.11 0 01/25/2025
3.0.10 0 01/14/2025
3.0.9 0 11/12/2024
3.0.9-gbb914c5083 0 09/12/2024
3.0.8 1 03/29/2026
3.0.8-gc872dd36a7 1 03/29/2026
3.0.7 0 11/01/2024
3.0.7-g7326cc7952 0 09/12/2024
3.0.7-g23b089add4 0 04/01/2024
3.0.7-g16a90295af 0 09/12/2024
3.0.6 0 09/13/2024
3.0.6-g1a8d58908d 0 04/27/2024
3.0.5 0 09/12/2024
3.0.4 0 04/29/2024
3.0.3 0 04/01/2024
3.0.3-g52f717c570 0 03/31/2024
3.0.3-g2e3740f28e 0 03/31/2024
3.0.2 0 03/31/2024
3.0.2-g1ec8e12b08 0 12/17/2023
3.0.1 0 12/17/2023
2.0.5-g44d1ffded6 0 12/17/2023
2.0.3 1 03/28/2026
2.0.2 0 06/14/2023
2.0.1 0 08/30/2022
1.1.5 0 12/02/2021
1.1.4 0 05/29/2021
1.1.2 0 05/20/2021
1.1.1 0 05/18/2021
0.1.20 1 03/29/2026
0.1.19 0 05/18/2021
0.1.18 0 05/18/2021
0.1.17 0 05/17/2021
0.1.15 0 05/17/2021
0.1.13-ga54ab93e06 0 05/17/2021
0.1.11-gf9f22361b4 0 05/17/2021
0.1.11-gd2c4a82063 1 03/29/2026
0.1.10-g97d215a597 1 03/29/2026
0.1.9-gfdbeeac4d0 0 05/17/2021
0.1.7-g4f7d811228 1 03/29/2026
0.1.3-ga995c8cead 0 05/17/2021
0.1.2-g30a7553669 0 05/17/2021