วิธีการใช้ 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 สุขภาพที่สามารถปรับขนาดได้ซึ่งจัดการกับข้อมูลภาพทางการแพทย์ขนาดใหญ่ได้อย่างมีประสิทธิภาพ