ASP.NET Barcode-Scanner: Datei-Upload und REST-API mit IronBarcode
Mit IronBarcode wird das Scannen von Barcodes in ASP.NET ganz einfach: Installation über NuGet, Aufruf von BarcodeReader.Read() und schon erhalten Sie in einem Schritt dekodierte Werte mit Typ-, Konfidenz- und Positionsdaten – keine komplexe Konfiguration erforderlich.
Das Scannen von Barcodes ist eine Standardvoraussetzung in modernen Webanwendungen und bildet die Grundlage für Workflows in den Bereichen Bestandsverwaltung, Dokumentenverarbeitung und Ticketvalidierung. Laut GS1 werden Barcodes weltweit täglich in über 6 Milliarden Transaktionen verwendet – eine Zahl, die unterstreicht, wie wichtig das genaue Lesen von Barcodes für jedes Geschäftssystem ist. Der Standard ISO/IEC 15415 definiert Qualitätsmetriken für 2D-Barcodesymbole, während der Standard ISO/IEC 15416 1D-lineare Barcodes abdeckt; beide werden von IronBarcode nativ unterstützt.
Dieser Leitfaden zeigt Ihnen, wie Sie mit IronBarcode zuverlässiges Barcode-Scannen in Ihre ASP.NET Core Anwendung integrieren. Er behandelt die Installation, die Verarbeitung von Datei-Uploads, die REST-API-Integration und die Bereitstellungsmuster für die Produktion. Am Ende verfügen Sie über funktionierenden Code sowohl für einen Razor -Page-Datei-Upload-Scanner als auch für einen JSON-API-Endpunkt, der Base64-kodierte Bilder von jedem Client akzeptiert.
Wie installiert man IronBarcode in einem ASP.NET -Projekt?
Der Einstieg dauert nur wenige Minuten. Die Bibliothek unterstützt sowohl ASP.NET Core als auch traditionelle ASP.NET MVC-Anwendungen und ist somit für verschiedene Projekttypen geeignet. Enterprise funktionieren gleichermaßen gut auf Azure , AWS Lambda und Docker-Containern . Die maschinelle Lernfunktion der Bibliothek ermöglicht die Verarbeitung anspruchsvoller Barcode-Bilder durch automatische Anwendung einer ausgeklügelten Bildkorrektur. Dies ist besonders nützlich bei der Verarbeitung von Fotos, die mit Handykameras unter wechselnden Lichtverhältnissen aufgenommen wurden.
Installation über NuGet Package Manager
Öffnen Sie die Paketmanager-Konsole in Visual Studio und führen Sie den Befehl aus:
Install-Package BarCode
Install-Package BarCode
Alternativ können Sie die .NET -Befehlszeilenschnittstelle verwenden:
dotnet add package BarCode
dotnet add package BarCode
Oder suchen Sie in der Benutzeroberfläche des Visual Studio NuGet -Paketmanagers nach "BarCode" und klicken Sie auf "Installieren". Das Paket verwaltet automatisch alle Abhängigkeiten.
Für plattformspezifische Bereitstellungen sollten Sie die Verwendung plattformspezifischer NuGet Pakete in Betracht ziehen, die für Ihre Zielumgebung optimiert sind. Die Bibliothek bietet sowohl Standard- als auch BarCode.Slim-Pakete für unterschiedliche Einsatzszenarien. Eine vollständige Installationsanleitung finden Sie im IronBarcode Installationshandbuch .
Konfigurieren Ihres Projekts
Nach der Installation fügen Sie die notwendige using-Anweisung zu Ihren C#-Dateien hinzu:
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Dieser Import ermöglicht Ihnen den Zugriff auf alle Barcode-Lese- und Generierungsfunktionen von IronBarcode. Die Bibliothek unterstützt über 30 Barcode-Formate, darunter QR-Code, Code 128, Code 39, Data Matrix und PDF417. Die vollständige Liste der unterstützten Barcode-Formate finden Sie hier. Prüfen Sie, ob diese mit Ihrem Anwendungsfall kompatibel sind.
Bei Installationsproblemen konsultieren Sie bitte den Leitfaden zur Fehlerbehebung der NuGet Pakete oder stellen Sie eine technische Anfrage für spezialisierte Unterstützung.
Das richtige Architekturmuster auswählen
Bei der Implementierung des Barcode-Scannens in ASP.NET gibt es zwei primäre Architekturansätze. Das Verständnis dieser Muster hilft Ihnen bei der Auswahl der richtigen Barcode-Lesegeräteeinstellungen für jeden Anwendungsfall:
// Server-side processing -- recommended for most ASP.NET scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(stream, options);
foreach (var barcode in results)
{
Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}");
}
// Server-side processing -- recommended for most ASP.NET scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(stream, options);
foreach (var barcode in results)
{
Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}");
}
Imports System
' Server-side processing -- recommended for most ASP.NET scenarios
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.85
}
Dim results = BarcodeReader.Read(stream, options)
For Each barcode In results
Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}")
Next
Der serverseitige Ansatz bietet Ihnen maximale Kontrolle über die Bildverarbeitung und funktioniert konsistent auf allen Browsern. Wenn der Server jedes Bild verarbeitet, erhalten Sie auch einen sauberen Prüfpfad: Jeder gescannte Barcode durchläuft Ihre Anwendungsschicht, wo Sie ihn protokollieren, mit einer Datenbank abgleichen oder nachgelagerte Arbeitsabläufe auslösen können. Dieses Muster eignet sich besonders gut für regulierte Branchen wie das Gesundheitswesen, die Logistik und die Fertigungsindustrie, wo jeder Scan protokolliert werden muss.
Für die clientseitige Kameraintegration unterstützen moderne Browser die MediaDevices API für den Kamerazugriff. Diese lässt sich mit der serverseitigen Verarbeitung von IronBarcode über eine REST-API kombinieren – ein ausführlicheres Thema dazu später in diesem Leitfaden. Die serverseitige Verarbeitung vereinfacht zudem Ihr Sicherheitsmodell: Sensible Verarbeitungslogik wird dem Browser nicht zugänglich gemacht, und die gesamte Validierung erfolgt außerhalb Ihrer Anwendung.
| Aspekt | Clientseitige Erfassung + Serververarbeitung | Reine serverseitige Verarbeitung |
|---|---|---|
| Am besten geeignet für | Echtzeit-Scannen mit Kamera | Stapelverarbeitung, Datei-Uploads |
| Browserunterstützung | Nur moderne Browser | Alle Browser |
| Benutzererfahrung | Sofortiges Feedback | Standardmäßiger Upload-Ablauf |
| Sicherheitsmodell | Komplexer (CORS, Authentifizierung) | Einfach |
| Bandbreitennutzung | Niedriger (auf dem Gerät vorverarbeitet) | Höher (Rohbild-Upload) |
Wie implementiert man das Scannen von Barcodes per Datei-Upload?
Das Scannen von hochgeladenen Dateien ist das häufigste Barcode-Szenario in ASP.NET -Webanwendungen. Dieses Muster eignet sich für die Verarbeitung von Rechnungen, Versandetiketten oder beliebigen Dokumenten mit eingebetteten Barcodes. Zur Verbesserung des Durchsatzes empfiehlt sich die Implementierung einer asynchronen Barcode-Lesung , um mehrere Uploads gleichzeitig zu verarbeiten.
Erstellung des Upload-Formulars
Erstellen Sie ein responsives HTML-Formular in Ihrer ASP.NET Ansicht:
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
<div class="form-group">
<label for="barcodeFile">Select Barcode Image:</label>
<input type="file" name="barcodeFile" id="barcodeFile"
accept="image/*,.pdf" class="form-control"
capture="environment" />
</div>
<button type="submit" class="btn btn-primary" id="scanBtn">
<span class="spinner-border spinner-border-sm d-none" role="status"></span>
Scan Barcode
</button>
</form>
<div id="results">
@ViewBag.BarcodeResult
</div>
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
<div class="form-group">
<label for="barcodeFile">Select Barcode Image:</label>
<input type="file" name="barcodeFile" id="barcodeFile"
accept="image/*,.pdf" class="form-control"
capture="environment" />
</div>
<button type="submit" class="btn btn-primary" id="scanBtn">
<span class="spinner-border spinner-border-sm d-none" role="status"></span>
Scan Barcode
</button>
</form>
<div id="results">
@ViewBag.BarcodeResult
</div>
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
<div class="form-group">
<label for="barcodeFile">Select Barcode Image:</label>
<input type="file" name="barcodeFile" id="barcodeFile"
accept="image/*,.pdf" class="form-control"
capture="environment" />
</div>
<button type="submit" class="btn btn-primary" id="scanBtn">
<span class="spinner-border spinner-border-sm d-none" role="status"></span>
Scan Barcode
</button>
</form>
<div id="results">
@ViewBag.BarcodeResult
</div>
Das Attribut capture="environment" aktiviert die Rückkamera auf Mobilgeräten und bietet Benutzern ein natives Kameraerlebnis ohne JavaScript.
Implementierung einer sicheren Backend-Verarbeitung
Die Controller-Aktion übernimmt die Dateivalidierung, die Verarbeitung des Speicherstroms und die Ergebnisformatierung:
[HttpPost]
[ValidateAntiForgeryToken]
[RequestSizeLimit(10_000_000)] // 10MB limit
public async Task<IActionResult> ScanBarcode(IFormFile barcodeFile)
{
var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif",
".tiff", ".bmp", ".pdf" };
var extension = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant();
if (!allowedExtensions.Contains(extension))
{
ModelState.AddModelError("", "Invalid file type");
return View();
}
if (barcodeFile != null && barcodeFile.Length > 0)
{
using var stream = new MemoryStream();
await barcodeFile.CopyToAsync(stream);
stream.Position = 0;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional |
BarcodeEncoding.QRCode |
BarcodeEncoding.DataMatrix,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter()
}
};
var results = BarcodeReader.Read(stream, options);
ViewBag.BarcodeResult = results.Any()
? string.Join("<br/>", results.Select(r => $"<strong>{r.BarcodeType}:</strong> {r.Text}"))
: "No barcodes found in the image.";
}
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
[RequestSizeLimit(10_000_000)] // 10MB limit
public async Task<IActionResult> ScanBarcode(IFormFile barcodeFile)
{
var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif",
".tiff", ".bmp", ".pdf" };
var extension = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant();
if (!allowedExtensions.Contains(extension))
{
ModelState.AddModelError("", "Invalid file type");
return View();
}
if (barcodeFile != null && barcodeFile.Length > 0)
{
using var stream = new MemoryStream();
await barcodeFile.CopyToAsync(stream);
stream.Position = 0;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional |
BarcodeEncoding.QRCode |
BarcodeEncoding.DataMatrix,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter()
}
};
var results = BarcodeReader.Read(stream, options);
ViewBag.BarcodeResult = results.Any()
? string.Join("<br/>", results.Select(r => $"<strong>{r.BarcodeType}:</strong> {r.Text}"))
: "No barcodes found in the image.";
}
return View();
}
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.AspNetCore.Http
Imports System.IO
Imports System.Threading.Tasks
Imports ZXing
<HttpPost>
<ValidateAntiForgeryToken>
<RequestSizeLimit(10_000_000)> ' 10MB limit
Public Async Function ScanBarcode(barcodeFile As IFormFile) As Task(Of IActionResult)
Dim allowedExtensions As String() = {".jpg", ".jpeg", ".png", ".gif", ".tiff", ".bmp", ".pdf"}
Dim extension As String = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant()
If Not allowedExtensions.Contains(extension) Then
ModelState.AddModelError("", "Invalid file type")
Return View()
End If
If barcodeFile IsNot Nothing AndAlso barcodeFile.Length > 0 Then
Using stream As New MemoryStream()
Await barcodeFile.CopyToAsync(stream)
stream.Position = 0
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional Or
BarcodeEncoding.QRCode Or
BarcodeEncoding.DataMatrix,
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(),
New ContrastFilter()
}
}
Dim results = BarcodeReader.Read(stream, options)
ViewBag.BarcodeResult = If(results.Any(),
String.Join("<br/>", results.Select(Function(r) $"<strong>{r.BarcodeType}:</strong> {r.Text}")),
"No barcodes found in the image.")
End Using
End If
Return View()
End Function
Diese Implementierung validiert den Dateityp vor der Verarbeitung, liest Barcodes aus einem Speicherstream und gibt alle erkannten Ergebnisse zurück. IronBarcode verarbeitet verschiedene Bildformate , darunter mehrseitige TIFF- und GIF- Dokumente sowie PDF-Dokumente , wodurch formatspezifischer Verarbeitungscode entfällt.
Wie die gescannten Eingabe- und Ausgabedaten aussehen

Das obige Beispiel zeigt einen Standard-Code-128-Barcode – ein gängiges Format in Versand- und Lagerverwaltungsanwendungen. Nach dem Scanvorgang bestätigt der Ergebnisbildschirm den dekodierten Wert zusammen mit den zugehörigen Konfidenz-Metadaten:

IronBarcode gibt für jeden im hochgeladenen Bild erkannten Barcode den Barcode-Typ, den dekodierten Wert, den Konfidenzwert und die Positionsdaten zurück.
Wie erstellt man eine REST-API für das Barcode-Scannen?
Moderne ASP.NET Anwendungen stellen häufig Barcode-Scanfunktionen über REST-APIs bereit und ermöglichen so die Integration mit mobilen Apps, Single-Page-Anwendungen oder Diensten von Drittanbietern. Dieses Muster unterstützt die clientseitige Kameraaufnahme mit serverseitiger Verarbeitung.
Sicherheitsaspekte für Barcode-APIs
Bevor Sie den Controller schreiben, planen Sie die Sicherheitsschicht. Barcode-Daten können beliebigen Inhalt enthalten, daher sollten Eingaben immer validiert werden. Befolgen Sie die Sicherheitsrichtlinien von IronBarcode für einen vollständigen Schutz:
- Eingabevalidierung : Barcode-Inhalte vor dem Speichern oder Verarbeiten bereinigen.
- Ratenbegrenzung : Verwenden Sie die in ASP.NET Core integrierte Middleware zur Ratenbegrenzung, um API-Missbrauch zu verhindern.
- Authentifizierung : Sichern Sie Endpunkte mit JWT-Tokens oder API-Schlüsseln
- HTTPS-Erzwingung : Der gesamte Datenverkehr der Barcode-API muss über TLS übertragen werden.
- CORS-Richtlinie : Beschränken Sie, welche Ursprünge Ihren Scan-Endpunkt aufrufen dürfen.
- Lizenzschlüsselverwaltung : Lizenzschlüssel korrekt anwenden und in der web.config-Datei für den Produktivbetrieb konfigurieren .
Erstellung des Produktions-API-Controllers
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
private readonly ILogger<BarcodeController> _logger;
private readonly IMemoryCache _cache;
public BarcodeController(ILogger<BarcodeController> logger, IMemoryCache cache)
{
_logger = logger;
_cache = cache;
}
[HttpPost("scan")]
[ProducesResponseType(typeof(BarcodeResponse), 200)]
[ProducesResponseType(typeof(ErrorResponse), 400)]
public async Task<IActionResult> ScanBarcode([FromBody] BarcodeRequest request)
{
try
{
if (string.IsNullOrEmpty(request.ImageBase64))
return BadRequest(new ErrorResponse { Error = "Image data is required" });
var cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}";
if (_cache.TryGetValue(cacheKey, out BarcodeResponse cachedResult))
return Ok(cachedResult);
byte[] imageBytes = Convert.FromBase64String(request.ImageBase64);
if (imageBytes.Length > 10 * 1024 * 1024)
return BadRequest(new ErrorResponse { Error = "Image size exceeds 10MB limit" });
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = request.ExpectMultiple ?? false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.8
};
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var response = new BarcodeResponse
{
Success = true,
Barcodes = results.Select(r => new BarcodeData
{
Type = r.BarcodeType.ToString(),
Value = r.Text,
Confidence = r.Confidence,
Position = new BarcodePosition
{
X = r.Points.Select(p => p.X).Min(),
Y = r.Points.Select(p => p.Y).Min(),
Width = r.Width,
Height = r.Height
}
}).ToList()
};
_cache.Set(cacheKey, response, TimeSpan.FromMinutes(5));
return Ok(response);
}
catch (FormatException)
{
return BadRequest(new ErrorResponse { Error = "Invalid base64 image data" });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing barcode scan");
return StatusCode(500, new ErrorResponse { Error = "Internal server error" });
}
}
}
public record BarcodeRequest(string ImageBase64, bool? ExpectMultiple);
public record BarcodeResponse
{
public bool Success { get; init; }
public List<BarcodeData> Barcodes { get; init; } = new();
}
public record BarcodeData
{
public string Type { get; init; }
public string Value { get; init; }
public double Confidence { get; init; }
public BarcodePosition Position { get; init; }
}
public record BarcodePosition(int X, int Y, int Width, int Height);
public record ErrorResponse
{
public bool Success => false;
public string Error { get; init; }
}
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
private readonly ILogger<BarcodeController> _logger;
private readonly IMemoryCache _cache;
public BarcodeController(ILogger<BarcodeController> logger, IMemoryCache cache)
{
_logger = logger;
_cache = cache;
}
[HttpPost("scan")]
[ProducesResponseType(typeof(BarcodeResponse), 200)]
[ProducesResponseType(typeof(ErrorResponse), 400)]
public async Task<IActionResult> ScanBarcode([FromBody] BarcodeRequest request)
{
try
{
if (string.IsNullOrEmpty(request.ImageBase64))
return BadRequest(new ErrorResponse { Error = "Image data is required" });
var cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}";
if (_cache.TryGetValue(cacheKey, out BarcodeResponse cachedResult))
return Ok(cachedResult);
byte[] imageBytes = Convert.FromBase64String(request.ImageBase64);
if (imageBytes.Length > 10 * 1024 * 1024)
return BadRequest(new ErrorResponse { Error = "Image size exceeds 10MB limit" });
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = request.ExpectMultiple ?? false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.8
};
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var response = new BarcodeResponse
{
Success = true,
Barcodes = results.Select(r => new BarcodeData
{
Type = r.BarcodeType.ToString(),
Value = r.Text,
Confidence = r.Confidence,
Position = new BarcodePosition
{
X = r.Points.Select(p => p.X).Min(),
Y = r.Points.Select(p => p.Y).Min(),
Width = r.Width,
Height = r.Height
}
}).ToList()
};
_cache.Set(cacheKey, response, TimeSpan.FromMinutes(5));
return Ok(response);
}
catch (FormatException)
{
return BadRequest(new ErrorResponse { Error = "Invalid base64 image data" });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing barcode scan");
return StatusCode(500, new ErrorResponse { Error = "Internal server error" });
}
}
}
public record BarcodeRequest(string ImageBase64, bool? ExpectMultiple);
public record BarcodeResponse
{
public bool Success { get; init; }
public List<BarcodeData> Barcodes { get; init; } = new();
}
public record BarcodeData
{
public string Type { get; init; }
public string Value { get; init; }
public double Confidence { get; init; }
public BarcodePosition Position { get; init; }
}
public record BarcodePosition(int X, int Y, int Width, int Height);
public record ErrorResponse
{
public bool Success => false;
public string Error { get; init; }
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Extensions.Logging
Imports Microsoft.Extensions.Caching.Memory
Imports System.Threading.Tasks
<ApiController>
<Route("api/[controller]")>
Public Class BarcodeController
Inherits ControllerBase
Private ReadOnly _logger As ILogger(Of BarcodeController)
Private ReadOnly _cache As IMemoryCache
Public Sub New(logger As ILogger(Of BarcodeController), cache As IMemoryCache)
_logger = logger
_cache = cache
End Sub
<HttpPost("scan")>
<ProducesResponseType(GetType(BarcodeResponse), 200)>
<ProducesResponseType(GetType(ErrorResponse), 400)>
Public Async Function ScanBarcode(<FromBody> request As BarcodeRequest) As Task(Of IActionResult)
Try
If String.IsNullOrEmpty(request.ImageBase64) Then
Return BadRequest(New ErrorResponse With {.Error = "Image data is required"})
End If
Dim cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}"
Dim cachedResult As BarcodeResponse = Nothing
If _cache.TryGetValue(cacheKey, cachedResult) Then
Return Ok(cachedResult)
End If
Dim imageBytes As Byte() = Convert.FromBase64String(request.ImageBase64)
If imageBytes.Length > 10 * 1024 * 1024 Then
Return BadRequest(New ErrorResponse With {.Error = "Image size exceeds 10MB limit"})
End If
Dim options = New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Faster,
.ExpectMultipleBarcodes = request.ExpectMultiple.GetValueOrDefault(False),
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.8
}
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
Dim response = New BarcodeResponse With {
.Success = True,
.Barcodes = results.Select(Function(r) New BarcodeData With {
.Type = r.BarcodeType.ToString(),
.Value = r.Text,
.Confidence = r.Confidence,
.Position = New BarcodePosition With {
.X = r.Points.Select(Function(p) p.X).Min(),
.Y = r.Points.Select(Function(p) p.Y).Min(),
.Width = r.Width,
.Height = r.Height
}
}).ToList()
}
_cache.Set(cacheKey, response, TimeSpan.FromMinutes(5))
Return Ok(response)
Catch ex As FormatException
Return BadRequest(New ErrorResponse With {.Error = "Invalid base64 image data"})
Catch ex As Exception
_logger.LogError(ex, "Error processing barcode scan")
Return StatusCode(500, New ErrorResponse With {.Error = "Internal server error"})
End Try
End Function
End Class
Public Class BarcodeRequest
Public Property ImageBase64 As String
Public Property ExpectMultiple As Boolean?
End Class
Public Class BarcodeResponse
Public Property Success As Boolean
Public Property Barcodes As List(Of BarcodeData) = New List(Of BarcodeData)()
End Class
Public Class BarcodeData
Public Property Type As String
Public Property Value As String
Public Property Confidence As Double
Public Property Position As BarcodePosition
End Class
Public Class BarcodePosition
Public Property X As Integer
Public Property Y As Integer
Public Property Width As Integer
Public Property Height As Integer
End Class
Public Class ErrorResponse
Public ReadOnly Property Success As Boolean
Get
Return False
End Get
End Property
Public Property Error As String
End Class
Dieser Endpunkt akzeptiert Base64-kodierte Bilder – das Standardformat für die Übertragung von Bildern über HTTP. Die Antwort enthält Barcode-Typ, dekodierten Wert, Konfidenzwert und Position. Bei Szenarien mit hohem Durchsatz sollten Sie die Optionen zur Stapelverarbeitung von Barcodes und zur Optimierung der Lesegeschwindigkeit prüfen.
Wie verarbeitet die API mehrere Barcodes?

IronBarcode verarbeitet mehrere Barcodes in einem einzigen Bild in einem einzigen Aufruf und gibt ein Array von Ergebnissen zurück. Jeder Eintrag in der Antwort enthält Positionsdaten, damit die Client-Anwendung erkannte Barcodes auf dem Bildschirm hervorheben kann.

Die strukturierte JSON-Antwort liefert Clientanwendungen alles, was sie zur Verarbeitung und Anzeige von Barcode-Ergebnissen benötigen, ohne dass zusätzliche Abfragen erforderlich sind.
Wie geht man mit problematischen Barcode-Bildern um?
Beim Scannen von Barcodes in der Praxis kommt es häufig zu fehlerhaften Bildern – Fotos, die aus schrägen Winkeln aufgenommen wurden, schlechte Lichtverhältnisse oder teilweise beschädigte Barcodes. IronBarcode begegnet diesen Szenarien durch seine fortschrittlichen Bildverarbeitungsfunktionen und maschinellen Lernverfahren zur Ermittlung von Konfidenzschwellenwerten .
Häufige Scanprobleme diagnostizieren
Bevor Sie Korrekturen vornehmen, ermitteln Sie, in welche Kategorie Ihr Problem fällt. Die meisten Scanfehler in der Produktion lassen sich in eine von fünf Gruppen einteilen: Probleme mit der Bildqualität (Unschärfe, Rauschen, niedrige Auflösung), geometrische Probleme (Drehung, Schräglage, perspektivische Verzerrung), Beschädigungsprobleme (zerrissene Etiketten, verschmierte Tinte), Umweltprobleme (Blendung, Schatten, ungleichmäßige Beleuchtung) und Fehlalarme, bei denen der Leser einen nicht vorhandenen Barcode findet.
Die Kenntnis der Bildkategorie hilft Ihnen, die richtige Filterkombination und Lesegeschwindigkeit auszuwählen, ohne unnötige Bearbeitungsschritte für jedes Bild durchführen zu müssen. Für die meisten Webanwendungsszenarien deckt die Verwendung von ReadingSpeed.Balanced und AutoRotate = true den Großteil der Fälle ab. Nur dann auf ExtremeDetail eskalieren, wenn der erste Durchlauf keine Ergebnisse liefert.
Der im folgenden Code dargestellte mehrstufige Ansatz implementiert diese gestaffelte Strategie. Der schnelle erste Durchlauf verarbeitet typische Bilder zügig, wodurch die mittlere Latenz im Normalfall niedrig bleibt. Der detaillierte zweite Durchlauf wird nur dann ausgelöst, wenn der erste Durchlauf fehlschlägt. Dadurch wird sichergestellt, dass Sie die zusätzlichen Verarbeitungskosten nur dann bezahlen, wenn sie tatsächlich erforderlich sind. Dieses Muster sorgt dafür, dass Ihr ASP.NET Endpunkt unter normaler Last reaktionsfähig bleibt und gleichzeitig schwierige Sonderfälle zuverlässig bewältigt.
| Problem | Symptom | Lösung |
|---|---|---|
| Unscharfes Bild | Niedrige Konfidenzwerte, Lesefehler | `SharpenFilter` anwenden, Geschwindigkeit `ExtremeDetail` erhöhen |
| Gedrehter Barcode | Barcode nicht erkannt | `AutoRotate = true` |
| Beschädigter Barcode | Unvollständige Messwerte, falsche Werte | Fehlerkorrektur aktivieren, `RemoveFalsePositive` verwenden |
| Geringer Kontrast | Inkonsistente Erkennung | `ContrastFilter` und `BrightnessFilter` anwenden |
| Leistung zu langsam | Hohe Latenz beim Hochladen | Verwenden Sie `ReadingSpeed.Faster` und aktivieren Sie Multithreading. |
Implementierung der Mehrpass-Bildverarbeitung
Bei anspruchsvollen Bildern liefert ein gestaffeltes Verarbeitungsverfahren die besten Ergebnisse, ohne die Leistung bei einfachen Bildern zu beeinträchtigen:
public class AdvancedBarcodeProcessor
{
private readonly ILogger<AdvancedBarcodeProcessor> _logger;
public async Task<List<ScannedBarcode>> ProcessChallengingImage(Stream imageStream)
{
// First pass -- fast, minimal processing
var fastOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
AutoRotate = false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(imageStream, fastOptions);
if (!results.Any())
{
// Second pass -- aggressive image correction
imageStream.Position = 0;
var detailedOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = true,
AutoRotate = true,
RemoveFalsePositive = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.6,
Multithreaded = true,
ExpectBarcodeTypes = BarcodeEncoding.All,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(2.5f),
new ContrastFilter(2.0f),
new BrightnessFilter(1.2f),
new InvertFilter()
}
};
results = BarcodeReader.Read(imageStream, detailedOptions);
_logger.LogInformation("Second pass detected {Count} barcodes", results.Count());
}
return results.Select(r => new ScannedBarcode
{
Value = r.Text,
BarcodeType = r.BarcodeType.ToString(),
Confidence = r.Confidence,
RotationAngle = r.RotationAngle,
PageNumber = r.PageNumber
}).ToList();
}
}
public record ScannedBarcode
{
public string Value { get; init; }
public string BarcodeType { get; init; }
public double Confidence { get; init; }
public float RotationAngle { get; init; }
public int PageNumber { get; init; }
}
public class AdvancedBarcodeProcessor
{
private readonly ILogger<AdvancedBarcodeProcessor> _logger;
public async Task<List<ScannedBarcode>> ProcessChallengingImage(Stream imageStream)
{
// First pass -- fast, minimal processing
var fastOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
AutoRotate = false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(imageStream, fastOptions);
if (!results.Any())
{
// Second pass -- aggressive image correction
imageStream.Position = 0;
var detailedOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = true,
AutoRotate = true,
RemoveFalsePositive = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.6,
Multithreaded = true,
ExpectBarcodeTypes = BarcodeEncoding.All,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(2.5f),
new ContrastFilter(2.0f),
new BrightnessFilter(1.2f),
new InvertFilter()
}
};
results = BarcodeReader.Read(imageStream, detailedOptions);
_logger.LogInformation("Second pass detected {Count} barcodes", results.Count());
}
return results.Select(r => new ScannedBarcode
{
Value = r.Text,
BarcodeType = r.BarcodeType.ToString(),
Confidence = r.Confidence,
RotationAngle = r.RotationAngle,
PageNumber = r.PageNumber
}).ToList();
}
}
public record ScannedBarcode
{
public string Value { get; init; }
public string BarcodeType { get; init; }
public double Confidence { get; init; }
public float RotationAngle { get; init; }
public int PageNumber { get; init; }
}
Imports System.IO
Imports System.Collections.Generic
Imports System.Linq
Imports System.Threading.Tasks
Public Class AdvancedBarcodeProcessor
Private ReadOnly _logger As ILogger(Of AdvancedBarcodeProcessor)
Public Async Function ProcessChallengingImage(imageStream As Stream) As Task(Of List(Of ScannedBarcode))
' First pass -- fast, minimal processing
Dim fastOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.AutoRotate = False,
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.85
}
Dim results = BarcodeReader.Read(imageStream, fastOptions)
If Not results.Any() Then
' Second pass -- aggressive image correction
imageStream.Position = 0
Dim detailedOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = True,
.AutoRotate = True,
.RemoveFalsePositive = True,
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.6,
.Multithreaded = True,
.ExpectBarcodeTypes = BarcodeEncoding.All,
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(2.5F),
New ContrastFilter(2.0F),
New BrightnessFilter(1.2F),
New InvertFilter()
}
}
results = BarcodeReader.Read(imageStream, detailedOptions)
_logger.LogInformation("Second pass detected {Count} barcodes", results.Count())
End If
Return results.Select(Function(r) New ScannedBarcode With {
.Value = r.Text,
.BarcodeType = r.BarcodeType.ToString(),
.Confidence = r.Confidence,
.RotationAngle = r.RotationAngle,
.PageNumber = r.PageNumber
}).ToList()
End Function
End Class
Public Class ScannedBarcode
Public Property Value As String
Public Property BarcodeType As String
Public Property Confidence As Double
Public Property RotationAngle As Single
Public Property PageNumber As Integer
End Class
Die Klasse BarcodeReaderOptions ermöglicht eine detaillierte Kontrolle über jeden Aspekt des Scanvorgangs. Die Einstellung AutoRotate verarbeitet Bilder, die in jedem Winkel aufgenommen wurden, während Bildfilter die Klarheit bei unscharfen oder kontrastarmen Barcodes verbessern. Detaillierte Konfigurationsinformationen finden Sie im Beispiel für die Einstellungen des Barcode-Lesegeräts und in den PDF-spezifischen Lesegeräteeinstellungen .
Bei der Arbeit mit PDFs sollten Sie in Erwägung ziehen, Barcodes auf die PDFs aufzudrucken oder Barcodes als PDF-Dokumente zu erstellen . Bei der Verarbeitung großer Datenmengen verbessert die Aktivierung von Multithreading über die asynchronen und Multithread-Funktionen den Durchsatz erheblich.
Hinzufügen von Browserkompatibilität und Fallback-Strategien
Die Unterstützung verschiedener Browser erfordert progressive Verbesserung. Moderne Browser auf Android und Desktop-Computern (Chrome, Edge und Firefox) unterstützen die MediaDevices.getUserMedia() API für den Kamerazugriff. Safari auf iOS unterstützt dies ab Version 11. Ältere Enterprise , IE11-Kompatibilitätsmodi und bestimmte abgeschottete Unternehmensumgebungen unterstützen möglicherweise überhaupt keinen Kamerazugriff, daher muss Ihr alternativer Datei-Upload-Pfad stets funktionsfähig bleiben.
Die empfohlene Vorgehensweise besteht darin, die Merkmalserkennung zur Laufzeit anstelle des User-Agent-Sniffings zu nutzen und die Kameraschnittstelle entsprechend ein- oder auszublenden. Beginnen Sie mit einer Benutzeroberfläche mit Kamerafunktion und kehren Sie elegant zum Datei-Upload zurück:
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
@* Camera capture -- hidden until JavaScript confirms support *@
<div id="cameraSection" class="d-none">
<video id="videoPreview" class="w-100" autoplay></video>
<button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
</div>
@* File upload -- always available as fallback *@
<div id="uploadSection">
<form method="post" enctype="multipart/form-data"
asp-action="ScanBarcode" asp-controller="Barcode">
<div class="form-group">
<label>Upload Barcode Image:</label>
<input type="file" name="file" accept="image/*,.pdf"
class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Upload and Scan</button>
</form>
</div>
</div>
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
@* Camera capture -- hidden until JavaScript confirms support *@
<div id="cameraSection" class="d-none">
<video id="videoPreview" class="w-100" autoplay></video>
<button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
</div>
@* File upload -- always available as fallback *@
<div id="uploadSection">
<form method="post" enctype="multipart/form-data"
asp-action="ScanBarcode" asp-controller="Barcode">
<div class="form-group">
<label>Upload Barcode Image:</label>
<input type="file" name="file" accept="image/*,.pdf"
class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Upload and Scan</button>
</form>
</div>
</div>
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
@* Camera capture -- hidden until JavaScript confirms support *@
<div id="cameraSection" class="d-none">
<video id="videoPreview" class="w-100" autoplay></video>
<button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
</div>
@* File upload -- always available as fallback *@
<div id="uploadSection">
<form method="post" enctype="multipart/form-data"
asp-action="ScanBarcode" asp-controller="Barcode">
<div class="form-group">
<label>Upload Barcode Image:</label>
<input type="file" name="file" accept="image/*,.pdf"
class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Upload and Scan</button>
</form>
</div>
</div>
Die Blazor Integration bietet moderne Webanwendungsunterstützung mit minimalem Konfigurationsaufwand, falls Sie einen komponentenorientierten Ansatz bevorzugen. Informationen zur Fehlerbehebung bei der Bereitstellung finden Sie im Leitfaden zu Laufzeitfehlern (Runtime CopyException) .
Was sind Ihre nächsten Schritte?
Das Scannen von Barcodes in ASP.NET ist mit IronBarcode unkompliziert. Sie installieren ein NuGet Paket, rufen BarcodeReader.Read() auf und erhalten zuverlässige Dekodierungsergebnisse für mehr als 30 Formate – einschließlich anspruchsvoller Bilder aus der realen Welt, mit denen andere Bibliotheken Schwierigkeiten haben.
Um auf dieser Grundlage weiter aufzubauen, erkunden Sie diese Ressourcen:
- Barcode-Lese-Tutorial – detaillierte Anleitung für alle Scan-Szenarien -Barcode-Generierung – Barcodes und QR-Codes programmatisch erstellen
- QR-Code-Generator – QR-Code-spezifische Funktionen und Gestaltung
- Bildkorrektur – Techniken zur Verbesserung der Scangenauigkeit bei schwierigen Bildern
- Asynchrone Verarbeitung und Multithreading – Skalierung der Barcode-Verarbeitung für Anwendungen mit hohem Datenverkehr
- Plattformübergreifende Kompatibilität – Bereitstellung unter Windows, Linux, Docker, Azure und AWS
- Unterstützte Barcode-Formate -- vollständige Liste der lesbaren und beschreibbaren Symbologien
- Fehlertoleranzmerkmale – zuverlässiger Betrieb auch unter widrigen Bedingungen
- API-Referenz – vollständige Dokumentation aller Klassen und Optionen
- Lizenzierungsoptionen – SaaS-, OEM- und Enterprise für Produktionsumgebungen
Starten Sie mit einer kostenlosen Testlizenz , um IronBarcode in Ihrer ASP.NET Anwendung ohne Einschränkungen zu testen. Die Testversion beinhaltet vollen Zugriff auf alle Funktionen, einschließlich der Erkennung verschiedener Formate, der Bildkorrektur und der in diesem Leitfaden gezeigten REST-API-Muster – damit Sie die Leistung anhand Ihrer eigenen Bilder bewerten können, bevor Sie sich für eine Produktionslizenz entscheiden. Für .NET MAUI Mobil-Apps, die das Scannen auf dem Gerät benötigen, siehe das .NET MAUI Barcode-Scanner-Tutorial , das die gleiche API auf iOS- und Android-Ziele erweitert.
Häufig gestellte Fragen
Was ist der Hauptzweck des Barcode-Scannens in ASP.NET-Anwendungen?
Barcode-Scanning in ASP.NET-Anwendungen wird hauptsächlich zur Verbesserung von Bestandsverwaltungssystemen, zur Ticketverarbeitung bei Veranstaltungen und zur Digitalisierung von Papierdokumenten verwendet, wodurch die Effizienz verbessert und Fehler reduziert werden.
Wie erleichtert IronBarcode das Barcode-Scanning in ASP.NET?
IronBarcode vereinfacht den Prozess des Barcode-Scannens in ASP.NET, indem es zuverlässige und effiziente Komponenten bereitstellt, die einfach in Webanwendungen integriert werden können, damit Entwickler schnell Scanfunktionen implementieren können.
Welche Arten von Barcodes können mit IronBarcode gescannt werden?
IronBarcode unterstützt das Scannen einer Vielzahl von Barcode-Formaten, darunter traditionelle lineare Barcodes und moderne 2D-Barcodes, und stellt so die Kompatibilität mit diversen Anwendungen sicher.
Kann IronBarcode beim Barcode-Scanning für die Dokumentenverarbeitung eingesetzt werden?
Ja, IronBarcode eignet sich gut für Workflows zur Dokumentenverarbeitung, bei denen es zur Digitalisierung und Organisation von Papierdokumenten durch das Scannen eingebetteter Barcodes verwendet werden kann.
Ist IronBarcode für Bestandsverwaltungssysteme geeignet?
IronBarcode ist eine ausgezeichnete Wahl für Bestandsverwaltungssysteme, da es eine effiziente Verfolgung von Produkten durch das Scannen von Barcodes ermöglicht und so Abläufe rationalisiert und Fehler minimiert.
Wie verbessert die Integration von IronBarcode die Ticketverarbeitung bei Veranstaltungen?
Durch die Integration von IronBarcode wird die Ticketverarbeitung bei Veranstaltungen nahtlos, da schnelle Scans von Ticket-Barcodes möglich sind, was eine schnelle und genaue Zutrittsverwaltung bei Veranstaltungen ermöglicht.
Welche Vorteile bietet die Verwendung von IronBarcode in ASP.NET-Projekten?
Die Verwendung von IronBarcode in ASP.NET-Projekten bietet mehrere Vorteile, darunter einfache Integration, Unterstützung für mehrere Barcode-Formate und verbesserte Anwendungsleistung, was eine robuste Lösung für Barcode-Scanning-Bedürfnisse darstellt.
Benötigt IronBarcode umfangreiche Programmierkenntnisse zur Implementierung?
Nein, IronBarcode ist entwicklerfreundlich gestaltet, sodass es einfach ist, Barcode-Scanning-Funktionalität in ASP.NET-Anwendungen mit minimalen Programmierkenntnissen zu implementieren.
Kann IronBarcode für mobile Webanwendungen verwendet werden?
Ja, IronBarcode kann in mobile Webanwendungen integriert werden, was Barcode-Scanning unterwegs ermöglicht und die Vielseitigkeit von ASP.NET-Projekten erhöht.




