วิธีการใช้ Async DICOM JSON Serialization ใน ASP.NET Core Web APIs

วิธีการใช้ Async DICOM JSON Serialization ใน ASP.NET Core Web APIs

กวดวิชานี้แสดงให้เห็นว่าวิธีการใช้การจัดเรียง Async DICOM JSON ใน APIs Web ASP.NET Core การดําเนินงาน Asynec เป็นสิ่งสําคัญสําหรับแอพพลิเคชันเว็บที่มีประสิทธิภาพสูงเพื่อป้องกันไม่ให้ลวดบล็อกและรักษาความตอบสนองภายใต้โหลด

ทําไมใช้ Async Serialization

  • ความสามารถในการสแกน:- ไม่บล็อก I / O ช่วยให้การจัดการคําขอที่แข่งขันมากขึ้น

    • ความรับผิดชอบ *:- เซิร์ฟเวอร์เว็บยังคงตอบสนองในระหว่างการประมวลผลไฟล์ขนาดใหญ่
  • ประสิทธิภาพทรัพยากร:- ความเสี่ยงจะถูกปล่อยให้ในขณะที่รอการดําเนินงาน I / O

ข้อกําหนด: การเตรียมสิ่งแวดล้อม

  • ติดตั้ง Visual Studio หรือ IDE .NET ที่เข้ากันได้ใด ๆ.
  • สร้างโครงการ 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 Deserialization Endpoint

สร้างจุดสิ้นสุดที่กําจัด 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 Serialization Endpoint

สร้างจุดสิ้นสุดที่จัดอันดับ 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: การจัดการ tokens การยกเลิก

Pass การยกเลิก tokens สําหรับการจัดการที่เหมาะสมของคําขอ

[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 แบบเต็มรูปแบบ

นี่คือตัวควบคุมที่สมบูรณ์ในการดําเนินการ 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 });
    }
}

ปฏิบัติที่ดีที่สุดเพิ่มเติม

การใช้การแจ้งเตือนสําหรับ Streams

ใช้รูปแบบการจัดเก็บที่เหมาะสมเสมอ:

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 ปรับปรุงความสามารถในการสแกน แต่ไม่จําเป็นต้องเร่งความต้องการส่วนบุคคล
  • ใช้ tokens การยกเลิกเพื่อจัดการการเชื่อมต่อของลูกค้าอย่างถูกต้อง
  • ตรวจสอบการใช้งานหน่วยความจําเมื่อประมวลผลไฟล์ DICOM ขนาดใหญ่

ข้อสรุป

การฝึกอบรมนี้ได้แสดงให้เห็นว่าวิธีการนําไปใช้การจัดเรียง Async DICOM JSON ใน APIs Web ASP.NET Core โดยใช้ Aspose.Medical การดําเนินงาน Asynec เป็นสิ่งสําคัญสําหรับการสร้าง API สุขภาพที่สามารถปรับขนาดได้ซึ่งจัดการกับข้อมูลภาพทางการแพทย์ขนาดใหญ่ได้อย่างมีประสิทธิภาพ

 แบบไทย