ASP.NET कोर वेब एपीआई में Async DICOM JSON सीरियल का उपयोग कैसे करें
इस ट्यूटोरियल में दिखाया गया है कि ASP.NET कोर वेब एपीआई में Async DICOM JSON सीरियल का उपयोग कैसे किया जाए. एसिंक ऑपरेशन तार ब्लॉक को रोकने और लोड के तहत प्रतिक्रियाशीलता को बनाए रखने के लिए उच्च हस्तक्षेप वेब अनुप्रयोगों में आवश्यक हैं.
Async Serialization का उपयोग क्यों करें?
स्केल करने के लिए:- गैर-ब्लॉकिंग I/O अधिक समकक्ष अनुरोधों को संभालने की अनुमति देता है।
- प्रतिबद्धता के लिए *:- वेब सर्वर बड़ी फ़ाइल प्रसंस्करण के दौरान प्रतिक्रियाशील रहता है।
- संसाधन प्रभावीता:- खतरे जारी किए जाते हैं जबकि I / O ऑपरेशन का इंतजार करते हैं।
आवश्यकताएँ: पर्यावरण को तैयार करन
- Visual Studio या किसी भी संगत .NET IDE सेट कर.
- एक नया ASP.NET कोर वेब एपीआई परियोजना बनाएं जो .NET 8 को लक्षित करता है।
- NuGet Package Manager से Aspose.Medical स्थापित करें।
Async DICOM JSON सीरियल के लिए कदम-दर-चरण गाइड
चरण 1: Aspose.Medical स्थापित करें
NuGet का उपयोग करके अपने परियोजना में Aspose.Medical लाइब्रेरी जोड़ें।
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: रद्द टोकन को संभालना
अनुरोध रद्द करने का सही तरीके से संभालने के लिए समाप्त टोकन पास करें।
[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 });
}
}अतिरिक्त सर्वश्रेष्ठ अभ्यास
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 विधियां स्केलिंग में सुधार करती हैं लेकिन जरूरी नहीं कि व्यक्तिगत अनुरोधों को तेज करें।
- क्लाइंट डिस्कनेक्शन को सही ढंग से संभालने के लिए रद्द टोकन का उपयोग करें।
- बड़ी DICOM फ़ाइलों को संसाधित करते समय स्मृति के उपयोग की निगरानी करें।
Conclusion
इस ट्यूटोरियल ने दिखाया है कि Aspose.Medical का उपयोग करके ASP.NET कोर वेब एपीआई में Async DICOM JSON श्रृंखला को कैसे लागू किया जाए. Asynec ऑपरेशन बड़े चिकित्सा इमेजिंग डेटा को प्रभावी ढंग से संभालने वाले स्केल करने योग्य स्वास्थ्य एप्आई का निर्माण करने के लिए आवश्यक हैं.