IRONSOFTWAREHOME
ビデオ

Cloudmersive Barcode APIからIronBarcodeへの移行

Curtis Chau
Curtis Chau
Updated: 2026年5月19日

これは、 .NETバーコードの歴史上、最もシンプルな移行事例です。 HTTPクライアントを削除してください。 NuGetパッケージを追加します。 APIキー管理を削除します。 残りは検索と置換です。

Cloudmersive for .NET SDKは生成されたREST APIクライアントで、HttpClient呼び出しの薄いラッパーです。 アプリケーション内のCloudmersive固有のコードはすべて、そのクライアントの設定、そのクライアントを介した呼び出し、またはネットワーク要求が失敗した場合のエラー処理のいずれかです。 IronBarcodeはネットワークに依存せずローカルでバーコードを処理するため、そのようなインフラストラクチャは一切不要です。


クイックスタート:3つのステップ

ステップ1:パッケージを交換する

dotnet remove package Cloudmersive.APIClient.NET.Barcode
dotnet add package BarCode
SHELL

ステップ2:名前空間の置換

// Remove these
using Cloudmersive.APIClient.NET.Barcode.Api;
using Cloudmersive.APIClient.NET.Barcode.Client;

// Add this
using IronBarCode;

ステップ3:APIキー設定をライセンスキーに置き換える

// Remove this
Configuration.Default.ApiKey.Add("Apikey", "YOUR-CLOUDMERSIVE-API-KEY");

// Replace with this — set once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

ASP.NET Coreアプリケーションでは、ライセンスキーをProgram.csに配置します:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var builder = WebApplication.CreateBuilder(args);
// ... rest of startup

費用:これまで使っていた金額とこれから使う金額

移行する前に、Cloudmersiveとの連携に実際にかかる費用を計算しておく価値があります。 計算は簡単だ。

1日の摂取量月間リクエストCloudmersiveティアIronBarcode (1回限り)
1日100ドル約3,000基本$19.99/月$999
1,000/日約30,000ビジネスプレミアム$99.99/月$999
1日5,000約15万中規模ビジネス$499.99/月$999
1日10,000約30万エンタープライズ(カスタム)$999
1日25,000人約75万エンタープライズ(カスタム)1,499ドル(Plus、開発者3名)

Cloudmersiveの料金が月$63以上である場合、IronBarcodeのLiteライセンスは最初の1年以内に元が取れます。 元が取れた後、IronBarcodeは更新不要の永続ライセンスで、1リクエストあたりの料金もありません。


コード移行の例

QRコード生成

Cloudmersiveで最も一般的な生成呼び出しは、 IronBarcodeに直接対応しています。

以前(Cloudmersive):

using Cloudmersive.APIClient.NET.Barcode.Api;
using Cloudmersive.APIClient.NET.Barcode.Client;

Configuration.Default.ApiKey.Add("Apikey", "YOUR-CLOUDMERSIVE-API-KEY");

var apiInstance = new GenerateBarcodeApi();

byte[] result = apiInstance.GenerateBarcodeQRCode("https://example.com");
File.WriteAllBytes("qr.png", result);

(IronBarcode)後:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

byte[] result = QRCodeWriter.CreateQrCode("https://example.com", 500)
    .ToPngBinaryData();
File.WriteAllBytes("qr.png", result);

// Or save directly
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

コード128生成

以前(Cloudmersive):

using Cloudmersive.APIClient.NET.Barcode.Api;
using Cloudmersive.APIClient.NET.Barcode.Client;

Configuration.Default.ApiKey.Add("Apikey", "YOUR-CLOUDMERSIVE-API-KEY");
var apiInstance = new GenerateBarcodeApi();

byte[] result = apiInstance.GenerateBarcodeCode128("SHIP-2024031500428");
File.WriteAllBytes("barcode.png", result);

(IronBarcode)後:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

BarcodeWriter.CreateBarcode("SHIP-2024031500428", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Or get bytes directly
byte[] result = BarcodeWriter.CreateBarcode("SHIP-2024031500428", BarcodeEncoding.Code128)
    .ToPngBinaryData();

バーコード読み取り

以前(Cloudmersive):

using Cloudmersive.APIClient.NET.Barcode.Api;
using Cloudmersive.APIClient.NET.Barcode.Client;

Configuration.Default.ApiKey.Add("Apikey", "YOUR-CLOUDMERSIVE-API-KEY");
var scanApi = new BarcodeScanApi();

using (var stream = File.OpenRead("barcode.png"))
{
    var result = scanApi.BarcodeScanImage(stream);
    if (result.Successful == true)
    {
        Console.WriteLine($"Value: {result.RawText}");
        Console.WriteLine($"Type: {result.BarcodeType}");
    }
}

(IronBarcode)後:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var results = BarcodeReader.Read("barcode.png");
var result = results.First();
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Type: {result.Format}");

非同期バーコード読み取り

Cloudmersiveの統合で非同期APIを使用している場合:

以前(Cloudmersive):

using Cloudmersive.APIClient.NET.Barcode.Api;
using Cloudmersive.APIClient.NET.Barcode.Client;

Configuration.Default.ApiKey.Add("Apikey", "YOUR-CLOUDMERSIVE-API-KEY");
var scanApi = new BarcodeScanApi();

using (var stream = File.OpenRead("barcode.png"))
{
    var result = await scanApi.BarcodeScanImageAsync(stream);
    return result.Successful == true ? result.RawText : null;
}

(IronBarcode)後:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// IronBarcode is synchronous; wrap in Task.Run to free the calling thread for CPU-bound work
var results = await Task.Run(() => BarcodeReader.Read("barcode.png"));
return results.FirstOrDefault()?.Value;

PDFファイルからバーコードを読み取る

CloudmersiveはネイティブのPDFサポートを提供していません。 既存のコードでスキャン前にPDFから画像を抽出している場合は、そのパイプライン全体をIronBarcodeの単一の呼び出しに置き換えてください。

以前(Cloudmersive - PDFの抽出は別途必要):

// Requires a separate PDF library to extract pages as images,
// then one Cloudmersive API call per extracted page image.
var scanApi = new BarcodeScanApi();
foreach (var pageImagePath in ExtractPdfPages("document.pdf"))
{
    using var stream = File.OpenRead(pageImagePath);
    var result = await scanApi.BarcodeScanImageAsync(stream);
    if (result.Successful == true)
    {
        Console.WriteLine($"Found: {result.RawText}");
    }
}

(IronBarcode)後:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// One call — all pages, all barcodes, no image extraction step
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

複数バーコード検出

複数のバーコードを含む文書をスキャンするコードをお持ちの場合:

以前(Cloudmersive - 複数回の呼び出しが必要):

// Cloudmersive returns one barcode per scan — multiple calls for multiple barcodes
var scanApi = new BarcodeScanApi();
var barcodeValues = new List<string>();

foreach (var croppedRegion in CropBarcodeRegions("invoice.png"))
{
    using var stream = new MemoryStream(croppedRegion);
    var result = await scanApi.BarcodeScanImageAsync(stream);
    if (result.Successful == true)
        barcodeValues.Add(result.RawText);
}

(IronBarcode)後:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
};

// One call — returns all barcodes in the image
var results = BarcodeReader.Read("invoice.png", options);
var barcodeValues = results.Select(r => r.Value).ToList();

不要になったインフラの撤去

これは移行作業の中で、新規に記述するコードよりも削除するコードの方が多くなるような部分です。

HTTP例外処理を削除する

Cloudmersiveの操作は、ネットワークエラー、HTTP 4xx/5xx応答、タイムアウト例外によって失敗する可能性があります。 これは通常、 IronBarcodeが必要としないtry/catch構造を生み出します。

// Remove all of this
try
{
    var result = await scanApi.BarcodeScanImageAsync(stream);
    // ...
}
catch (ApiException ex) when (ex.ErrorCode == 429)
{
    // Rate limited — wait and retry
    await Task.Delay(TimeSpan.FromSeconds(2));
    // retry logic...
}
catch (ApiException ex) when (ex.ErrorCode == 503)
{
    // Service unavailable — Cloudmersive is down
    _logger.LogError("Cloudmersive unavailable: {Message}", ex.Message);
    throw;
}
catch (HttpRequestException ex)
{
    // Network error
    _logger.LogError("Network failure: {Message}", ex.Message);
    throw;
}
catch (TaskCanceledException)
{
    // Timeout
    _logger.LogError("Cloudmersive request timed out");
    throw;
}

IronBarcodeはネットワーク例外をスローしません。 バーコードが入力からデコードできない場合、それはインフラストラクチャの問題ではなく、コンテンツの問題としてBarcodeExceptionがスローされます。 簡略化されたエラー処理:

using IronBarCode;

var results = BarcodeReader.Read("barcode.png");
if (!results.Any())
{
    _logger.LogWarning("No barcode detected in image");
}

再試行ロジックを削除

Cloudmersiveとの連携に再試行ポリシー(Polly、カスタム再試行ループ、指数バックオフなど)が含まれている場合は、それらを完全に削除してください。

// Remove retry infrastructure
// var retryPolicy = Policy
//     .Handle<ApiException>()
//     .WaitAndRetryAsync(3, retryAttempt =>
//         TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

// IronBarcode — no retry needed
var results = BarcodeReader.Read("barcode.png");

レート制限追跡を解除する

コードがCloudmersiveの月間クォータ内に収まるようにAPI呼び出し回数を追跡している場合:

// Remove quota tracking
// private static int _monthlyCallCount = 0;
// private const int MonthlyLimit = 30000;
//
// if (Interlocked.Increment(ref _monthlyCallCount) > MonthlyLimit)
//     throw new InvalidOperationException("Monthly Cloudmersive quota exceeded");

// IronBarcode — no quota
var results = BarcodeReader.Read("barcode.png");

ネットワークタイムアウト設定を削除する

Cloudmersiveのクライアントには、タイムアウト設定が含まれていることが多い。 削除してください:

// Remove timeout configuration
// Configuration.Default.Timeout = 30000; // 30 second timeout
// Configuration.Default.ConnectionTimeout = 5000;

// IronBarcode has no network timeout — no network

APIキーローテーションを削除する

アプリケーションがAPIキーを定期的にローテーションするか、シークレット管理に保存する場合:

// Simplify this pattern
// private string GetCloudmersiveApiKey() =>
//     _secretManager.GetSecret("cloudmersive-api-key-current");
//
// Configuration.Default.ApiKey["Apikey"] = GetCloudmersiveApiKey();

// IronBarcode — set once at startup
IronBarCode.License.LicenseKey = _configuration["IronBarcode:LicenseKey"];
// or literal: "YOUR-LICENSE-KEY"

よくある移行の問題

Cloudmersiveが生成のためにbyte[]を返しました

Cloudmersiveの生成メソッドはbyte[]を直接返します。 IronBarcodeは、より多くのオプションを提供するGeneratedBarcodeオブジェクトを返します。

// Cloudmersive returned byte[] directly
byte[] cloudmersiveResult = apiInstance.GenerateBarcodeQRCode("data");

// IronBarcode — call ToPngBinaryData() for the equivalent byte[]
byte[] ironBarcodeResult = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode)
    .ToPngBinaryData();

// Or save directly (often simpler)
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode)
    .SaveAsPng("output.png");

// Or get other formats
byte[] jpegBytes = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode)
    .ToJpegBinaryData();

Cloudmersive Reading が JSON レスポンス モデルを返しました

Cloudmersiveのスキャン結果は、BarcodeTypeなどのプロパティを持つレスポンスモデルです。 IronBarcodeは型付きの結果オブジェクトを返します。

// Cloudmersive result model
if (cloudmersiveResult.Successful == true)
{
    string value = cloudmersiveResult.RawText;
    string type = cloudmersiveResult.BarcodeType;
}

// IronBarcode result — use .Value and .Format directly
var results = BarcodeReader.Read("barcode.png");
if (results.Any())
{
    string value = results.First().Value;
    string format = results.First().Format.ToString();
}

複数のCloudmersive APIインスタンスタイプ

Cloudmersiveは生成とスキャンをBarcodeScanApiインスタンスに分けています。 IronBarcodeは静的クラスを使用するため、インスタンスは不要です。

// Cloudmersive — two separate API instances
var generateApi = new GenerateBarcodeApi();
var scanApi = new BarcodeScanApi();

// IronBarcode — static, no instances
// BarcodeWriter for generation
// BarcodeReader for reading
// QRCodeWriter for QR codes specifically

移行チェックリスト

移行前と移行後にコードベースで以下の検索を実行して、Cloudmersiveへの参照がすべて検出されていることを確認してください。

# Find all Cloudmersive references
grep -r "Cloudmersive" --include="*.cs" .
grep -r "GenerateBarcodeApi" --include="*.cs" .
grep -r "BarcodeScanApi" --include="*.cs" .
grep -r "Configuration.Default.ApiKey" --include="*.cs" .
grep -r '"Apikey"' --include="*.cs" .
grep -r "GenerateBarcodeQRCode" --include="*.cs" .
grep -r "GenerateBarcodeCode128" --include="*.cs" .
grep -r "BarcodeScanImage" --include="*.cs" .
grep -r "cloudmersive" --include="*.csproj" .
grep -r "cloudmersive" --include="*.json" .
SHELL

移行後、すべての検索結果はゼロになるはずです。 次に、 IronBarcodeが正しく参照されていることを確認します。

grep -r "IronBarCode" --include="*.cs" .
grep -r "BarcodeReader" --include="*.cs" .
grep -r "BarcodeWriter" --include="*.cs" .
SHELL

構成チェックリスト

  • すべてのCloudmersive.APIClient.NET.Barcodeを削除します
  • Cloudmersive APIキーをappsettings.json、環境変数、および秘密ストアから削除します IronBarcode NuGetパッケージを追加する
  • アプリケーション起動時にIronBarCode.License.LicenseKey初期化を追加します
  • Cloudmersive コールの再試行ポリシーとサーキットブレーカーを削除します
  • レート制限追跡コードを削除する ネットワークタイムアウト設定を削除します

テストチェックリスト

移行完了後:

  • QRコード生成結果が有効でスキャン可能な出力であることを確認する
  • Code128およびその他のリニアバーコード生成を検証する
  • 一般的な画像フォーマット(PNG、JPEG、BMP)からのバーコード読み取りを検証する PDF文書を処理する場合は、PDFの読み取りテストを行ってください。
  • 該当する場合は、複数バーコード検出をテストする
  • ネットワークトラフィックにCloudmersive API呼び出しが表示されないことを確認する
  • インターネット接続がない状態でアプリケーションが正しく動作することを確認してください。

移行後に得られるもの

コスト削減に加え、この移行によって運用上の懸念事項が一掃される。

ネットワークに依存するバーコード処理はもう必要ありません。Cloudmersiveの可用性、インターネット接続の品質、ネットワーク遅延の急上昇に関係なく、ドキュメント処理パイプラインは正常に動作します。

**割り当て量の管理はもう不要です。**月末の文書量急増による予期せぬ超過や処理エラーも発生しません。

**ネットワークからデータが流出することはもうありません。**機密性の高い顧客情報、財務情報、または健康情報を含むバーコード画像は、お客様のインフラストラクチャ上に保持されます。

**コードがよりシンプルになりました。**本番環境のCloudmersive統合に必要な再試行インフラストラクチャ、タイムアウト処理、HTTP例外管理は不要になりました。 その代わりに、直接的なメソッド呼び出しが行われる。

移行は機械的なものである。 そのメリットは構造的なものであり、外部ネットワークサービスを必要としないワークフローから、そのサービスへの依存を排除​​できるという点にある。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。