Zum Fußzeileninhalt springen
IRONBARCODE VERWENDEN

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
SHELL

Alternativ können Sie die .NET -Befehlszeilenschnittstelle verwenden:

dotnet add package BarCode
dotnet add package BarCode
SHELL

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;
$vbLabelText   $csharpLabel

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}");
}
$vbLabelText   $csharpLabel

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.

Abwägungen beim clientseitigen vs. serverseitigen Barcode-Scanning
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>
$vbLabelText   $csharpLabel

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();
}
$vbLabelText   $csharpLabel

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

Code 128 Barcode-Codierungs-URL 'https://ironsoftware.com/csharp/barcode/', die maschinenlesbare Balken mit darunter lesbarem Text für genaues Scannen in ASP.NET -Barcode-Leseanwendungen anzeigt

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:

 ASP.NET Core Webanwendungsoberfläche zur Anzeige erfolgreicher Barcode-Scan-Ergebnisse mit Datei-Upload-Formular, das den dekodierten Code128-Barcodewert und Metadaten zum Konfidenzwert anzeigt.

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; }
}
$vbLabelText   $csharpLabel

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?

Drei verschiedene Barcode-Formate, bezeichnet mit ABC, die QR-Code, Code128 und DataMatrix-Symbologien demonstrieren, die IronBarcode gleichzeitig in Produktionsumgebungen verarbeitet.

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 Netzwerk-Registerkarte der Browser-Entwicklertools zeigt eine erfolgreiche JSON-API-Antwort mit einem Array von drei erkannten Barcodes und vollständigen Metadaten, einschließlich Typ, Wert, Konfidenz und Positionskoordinaten.

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.

Häufige Probleme beim Barcode-Scannen und Lösungen
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; }
}
$vbLabelText   $csharpLabel

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>
$vbLabelText   $csharpLabel

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:

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.

Jordi Bardia
Software Ingenieur
Jordi ist am besten in Python, C# und C++ versiert. Wenn er nicht bei Iron Software seine Fähigkeiten einsetzt, programmiert er Spiele. Mit Verantwortung für Produkttests, Produktentwicklung und -forschung trägt Jordi mit immensem Wert zur kontinuierlichen Produktverbesserung bei. Die abwechslungsreiche Erfahrung hält ihn gefordert und engagiert, ...
Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an