كيفية استخدام Async DICOM JSON Serialization في ASP.NET Core Web APIs

كيفية استخدام Async DICOM JSON Serialization في ASP.NET Core Web APIs

يظهر هذا الدليل كيفية استخدام التسلسل Async DICOM JSON في APIs الويب ASP.NET Core. تعتبر عمليات Asynec ضرورية للتطبيقات الالكترونية ذات النطاق العالي لمنع حجب الأسلاك والحفاظ على الاستجابة تحت الحمل.

لماذا تستخدم Async Serialization؟

  • التكلفة:- لا يمنع I/O يتيح التعامل مع المزيد من الطلبات المتناقضة.

    • الاستجابة * :- يبقى خادم الويب استجابة أثناء معالجة الملفات الكبيرة.
    • كفاءة الموارد* :- يتم إطلاق سراح التهديدات في انتظار عمليات I/O.

المعايير: إعداد البيئة

  • إعداد Visual Studio أو أي .NET IDE متوافق.
  • إنشاء مشروع جديد ASP.NET Core Web API يستهدف .NET 8.
  • قم بتثبيت Aspose.Medical من NuGet Package Manager.

دليل خطوة بخطوة لـ Async DICOM JSON

الخطوة 1: تثبيت Aspose.Medical

إضافة مكتبة Aspose.Medical إلى مشروعك باستخدام NuGet.

Install-Package Aspose.Medical

الخطوة 2: إدراج المساحات المطلوبة

إضافة الإشارات إلى المساحات الاسمية المطلوبة في جهاز التحكم الخاص بك.

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
using Microsoft.AspNetCore.Mvc;

الخطوة 3: إنشاء نقطة نهاية لتفريغ Async

إنشاء نقطة نهاية تتلاشى JSON من هيئة الطلب.

[HttpPost("import")]
public async Task<IActionResult> ImportDicomJson()
{
    Dataset? dataset = await DicomJsonSerializer.DeserializeAsync(Request.Body);
    
    if (dataset == null)
        return BadRequest("Invalid DICOM JSON");
    
    return Ok("DICOM data imported successfully");
}

الخطوة 4: إنشاء نقطة نهاية للتسلسل Async

قم بإنشاء نقطة نهاية تقوم بتسلسل DICOM إلى JSON في الرد.

[HttpGet("export/{filename}")]
public async Task ExportDicomJson(string filename)
{
    DicomFile dcm = DicomFile.Open($"storage/{filename}");
    
    Response.ContentType = "application/json";
    await DicomJsonSerializer.SerializeAsync(Response.Body, dcm.Dataset);
}

الخطوة 5: التعامل مع توكن إلغاء

خذ علامات الإلغاء للحصول على معالجة الطلب المناسبة.

[HttpPost("process")]
public async Task<IActionResult> ProcessDicomAsync(CancellationToken cancellationToken)
{
    Dataset? dataset = await DicomJsonSerializer.DeserializeAsync(
        Request.Body, 
        cancellationToken
    );
    
    if (cancellationToken.IsCancellationRequested)
        return StatusCode(499, "Client Closed Request");
    
    // Process dataset...
    return Ok();
}

تحميل برنامج ASP.NET Core Controller

فيما يلي جهاز التحكم الكامل الذي يقوم بتنفيذ عمليات Async DICOM JSON:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
using Microsoft.AspNetCore.Mvc;

namespace DicomApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class DicomController : ControllerBase
{
    private readonly string _storagePath = "dicom_storage";

    public DicomController()
    {
        Directory.CreateDirectory(_storagePath);
    }

    /// <summary>
    /// Import DICOM JSON and save as DICOM file
    /// </summary>
    [HttpPost("import")]
    public async Task<IActionResult> ImportDicomJson(CancellationToken cancellationToken)
    {
        try
        {
            Dataset? dataset = await DicomJsonSerializer.DeserializeAsync(
                Request.Body, 
                cancellationToken
            );

            if (dataset == null)
                return BadRequest("Failed to deserialize DICOM JSON");

            // Generate unique filename
            string filename = $"{Guid.NewGuid()}.dcm";
            string filepath = Path.Combine(_storagePath, filename);

            // Save as DICOM file
            DicomFile dcm = new DicomFile(dataset);
            dcm.Save(filepath);

            return Ok(new { message = "DICOM imported successfully", filename });
        }
        catch (OperationCanceledException)
        {
            return StatusCode(499, "Request cancelled");
        }
        catch (Exception ex)
        {
            return BadRequest($"Import failed: {ex.Message}");
        }
    }

    /// <summary>
    /// Export DICOM file as JSON stream
    /// </summary>
    [HttpGet("export/{filename}")]
    public async Task ExportDicomJson(string filename, CancellationToken cancellationToken)
    {
        string filepath = Path.Combine(_storagePath, filename);

        if (!System.IO.File.Exists(filepath))
        {
            Response.StatusCode = 404;
            await Response.WriteAsync("File not found");
            return;
        }

        try
        {
            DicomFile dcm = DicomFile.Open(filepath);
            
            Response.ContentType = "application/json";
            Response.Headers["Content-Disposition"] = $"attachment; filename=\"{filename}.json\"";
            
            await DicomJsonSerializer.SerializeAsync(
                Response.Body, 
                dcm.Dataset, 
                writeIndented: true
            );
        }
        catch (OperationCanceledException)
        {
            // Client disconnected
        }
        catch (Exception ex)
        {
            Response.StatusCode = 500;
            await Response.WriteAsync($"Export failed: {ex.Message}");
        }
    }

    /// <summary>
    /// Convert uploaded DICOM file to JSON
    /// </summary>
    [HttpPost("convert")]
    [RequestSizeLimit(100_000_000)] // 100MB limit
    public async Task ConvertDicomToJson(IFormFile file, CancellationToken cancellationToken)
    {
        if (file == null || file.Length == 0)
        {
            Response.StatusCode = 400;
            await Response.WriteAsync("No file uploaded");
            return;
        }

        try
        {
            // Save uploaded file temporarily
            string tempPath = Path.GetTempFileName();
            using (var stream = System.IO.File.Create(tempPath))
            {
                await file.CopyToAsync(stream, cancellationToken);
            }

            // Load and convert
            DicomFile dcm = DicomFile.Open(tempPath);
            
            Response.ContentType = "application/json";
            await DicomJsonSerializer.SerializeAsync(
                Response.Body, 
                dcm.Dataset, 
                writeIndented: true
            );

            // Cleanup temp file
            System.IO.File.Delete(tempPath);
        }
        catch (OperationCanceledException)
        {
            // Client disconnected
        }
        catch (Exception ex)
        {
            Response.StatusCode = 500;
            await Response.WriteAsync($"Conversion failed: {ex.Message}");
        }
    }
}

تثبيت الحد الأقصى لحجم الطلب

بالنسبة لملفات DICOM الكبيرة ، قم بتعيين حدود الطلب في Program.cs:

var builder = WebApplication.CreateBuilder(args);

// Configure Kestrel for large uploads
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 500_000_000; // 500MB
});

// Configure form options
builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 500_000_000;
});

var app = builder.Build();

نموذج معالجة التدفق

معالجة ملفات DICOM دون تحميلها بالكامل في الذاكرة:

[HttpPost("stream-process")]
public async Task StreamProcessDicom(CancellationToken cancellationToken)
{
    // Read JSON from request body stream
    using var reader = new StreamReader(Request.Body);
    string json = await reader.ReadToEndAsync(cancellationToken);
    
    // Deserialize
    Dataset? dataset = DicomJsonSerializer.Deserialize(json);
    
    if (dataset == null)
    {
        Response.StatusCode = 400;
        await Response.WriteAsync("Invalid JSON");
        return;
    }
    
    // Process and stream response
    Response.ContentType = "application/json";
    await DicomJsonSerializer.SerializeAsync(
        Response.Body, 
        dataset, 
        writeIndented: true
    );
}

أفضل ممارسات التعامل مع الأخطاء

التعامل مع الأخطاء الشاملة:

[HttpPost("safe-import")]
public async Task<IActionResult> SafeImportDicomJson(CancellationToken cancellationToken)
{
    try
    {
        Dataset? dataset = await DicomJsonSerializer.DeserializeAsync(
            Request.Body, 
            cancellationToken
        );

        if (dataset == null)
            return BadRequest(new { error = "Invalid DICOM JSON format" });

        // Process dataset...
        return Ok(new { success = true });
    }
    catch (OperationCanceledException)
    {
        return StatusCode(499, new { error = "Request cancelled by client" });
    }
    catch (JsonException ex)
    {
        return BadRequest(new { error = "JSON parsing error", details = ex.Message });
    }
    catch (OutOfMemoryException)
    {
        return StatusCode(507, new { error = "File too large to process" });
    }
    catch (Exception ex)
    {
        return StatusCode(500, new { error = "Internal server error", details = ex.Message });
    }
}

المزيد من أفضل الممارسات

استخدام البيانات للبث

استخدم دائمًا أنماط التخزين المناسبة:

using (FileStream fs = System.IO.File.OpenRead(filepath))
{
    // Process stream
}

تكوين Timeout

إعداد التوقيت المناسب للعمليات الطويلة:

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(2);
    options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5);
});

معلومات إضافية

  • أساليب Async تحسن التوسع ولكن ليس بالضرورة تسريع الطلبات الفردية.
  • استخدم علامات الإلغاء للتعامل بشكل صحيح مع انحرافات العميل.
  • مراقبة استخدام الذاكرة عند معالجة ملفات DICOM الكبيرة.

استنتاجات

وقد أظهرت هذه الدليل كيفية تنفيذ التسلسل Async DICOM JSON في APIs ASP.NET Core على شبكة الإنترنت باستخدام Aspose.Medical.

 عربي