स्वास्थ्य देखभाल संगठनों को अधिक से अधिक चिकित्सा छवि डेटा को अनदेखा करने के लिए स्वचालित समाधानों की आवश्यकता होती है. इस गाइड में, आप सीखेंगे कि ASP.NET कोर में एक DICOM गुमनाम माइक्रोसेव कैसे बनाया जाए जो HTTP के माध्यम से डीआईसीओएम फ़ाइल प्राप्त करता है, उन्हें कॉन्फ़िगर योग्य प्रोफाइल का उपयोग करके अज्ञात बनाता है और निष्पादित परिणाम वापस लाएगा. आखिरकार, आपके पास नमूना स्रोत कोड के साथ एक उत्पादन तैयार सेवा आर्किटेक्चर होगा.

सामग्री तालिक

आर्किटेक्चर समीक्षा

एपीआई परत एएसपी.नेट कोर नियंत्रकों के माध्यम से HTTP अनुरोधों और उत्तरों को संभालती है. सेवा परत Aspose.Medical Anonymizer का उपयोग करके व्यवसाय तर्क को शामिल करती है।

यह आर्किटेक्चर क्षैतिज स्केलिंग, आसानी से परीक्षण, और अस्पताल सूचना प्रणालियों और पीएसीएस सर्वर के साथ सरल एकीकरण की अनुमति देता है।

प्रोजेक्ट सेटअप

एक नया ASP.NET कोर वेब एपीआई परियोजना बनाकर शुरू करें और आवश्यक पैकेज स्थापित करें:

dotnet new webapi -n DicomAnonymizationService
cd DicomAnonymizationService
dotnet add package Aspose.Medical

बड़ी फ़ाइल अपलोड के लिए प्रोजेक्ट सेट करें Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

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

// Register services
builder.Services.AddScoped<IDicomAnonymizationService, DicomAnonymizationService>();
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

सेवा परत का कार्यान्वयन

एनीमेशन सेवा के लिए एक इंटरफ़ेस और कार्यान्वयन बनाएं:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;

public interface IDicomAnonymizationService
{
    Task<byte[]> AnonymizeAsync(Stream inputStream, string? profileName = null);
    Task<byte[]> AnonymizeAsync(byte[] inputBytes, string? profileName = null);
}

public class DicomAnonymizationService : IDicomAnonymizationService
{
    private readonly ILogger<DicomAnonymizationService> _logger;
    private readonly Dictionary<string, ConfidentialityProfileOptions> _profiles;

    public DicomAnonymizationService(ILogger<DicomAnonymizationService> logger)
    {
        _logger = logger;
        _profiles = new Dictionary<string, ConfidentialityProfileOptions>
        {
            ["basic"] = ConfidentialityProfileOptions.BasicProfile,
            ["research"] = ConfidentialityProfileOptions.BasicProfile | 
                          ConfidentialityProfileOptions.RetainPatientChars,
            ["internal"] = ConfidentialityProfileOptions.RetainUIDs | 
                          ConfidentialityProfileOptions.RetainDeviceIdent,
            ["clean"] = ConfidentialityProfileOptions.CleanGraph | 
                       ConfidentialityProfileOptions.CleanDesc
        };
    }

    public async Task<byte[]> AnonymizeAsync(Stream inputStream, string? profileName = null)
    {
        using var memoryStream = new MemoryStream();
        await inputStream.CopyToAsync(memoryStream);
        return await AnonymizeAsync(memoryStream.ToArray(), profileName);
    }

    public Task<byte[]> AnonymizeAsync(byte[] inputBytes, string? profileName = null)
    {
        return Task.Run(() =>
        {
            // Create anonymizer with selected profile
            Anonymizer anonymizer = CreateAnonymizer(profileName);

            // Load DICOM from bytes
            using var inputStream = new MemoryStream(inputBytes);
            DicomFile dcm = DicomFile.Open(inputStream);

            // Anonymize
            DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);

            // Write to output stream
            using var outputStream = new MemoryStream();
            anonymizedDcm.Save(outputStream);

            _logger.LogInformation("Anonymized DICOM file using profile: {Profile}", 
                profileName ?? "default");

            return outputStream.ToArray();
        });
    }

    private Anonymizer CreateAnonymizer(string? profileName)
    {
        if (string.IsNullOrEmpty(profileName) || !_profiles.ContainsKey(profileName.ToLower()))
        {
            return new Anonymizer();
        }

        var options = _profiles[profileName.ToLower()];
        var profile = ConfidentialityProfile.CreateDefault(options);
        return new Anonymizer(profile);
    }
}

API नियंत्रक का निर्माण

एक नियंत्रक बनाएं जो फ़ाइल अपलोड को संभालता है और एनीमेटेड डीआईसीओएम फाइलों को वापस करता है:

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class AnonymizeController : ControllerBase
{
    private readonly IDicomAnonymizationService _anonymizationService;
    private readonly ILogger<AnonymizeController> _logger;

    public AnonymizeController(
        IDicomAnonymizationService anonymizationService,
        ILogger<AnonymizeController> logger)
    {
        _anonymizationService = anonymizationService;
        _logger = logger;
    }

    /// <summary>
    /// Anonymize a single DICOM file
    /// </summary>
    [HttpPost]
    [RequestSizeLimit(500_000_000)]
    public async Task<IActionResult> AnonymizeFile(
        IFormFile file,
        [FromQuery] string? profile = null)
    {
        if (file == null || file.Length == 0)
        {
            return BadRequest("No file uploaded");
        }

        try
        {
            _logger.LogInformation("Processing file: {FileName}, Size: {Size}", 
                file.FileName, file.Length);

            using var stream = file.OpenReadStream();
            byte[] anonymizedBytes = await _anonymizationService.AnonymizeAsync(stream, profile);

            string outputFileName = $"anonymized_{file.FileName}";
            return File(anonymizedBytes, "application/dicom", outputFileName);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error anonymizing file: {FileName}", file.FileName);
            return StatusCode(500, $"Anonymization failed: {ex.Message}");
        }
    }

    /// <summary>
    /// Anonymize DICOM data from request body
    /// </summary>
    [HttpPost("stream")]
    [RequestSizeLimit(500_000_000)]
    public async Task<IActionResult> AnonymizeStream([FromQuery] string? profile = null)
    {
        try
        {
            byte[] anonymizedBytes = await _anonymizationService.AnonymizeAsync(
                Request.Body, profile);

            return File(anonymizedBytes, "application/dicom", "anonymized.dcm");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error anonymizing stream");
            return StatusCode(500, $"Anonymization failed: {ex.Message}");
        }
    }

    /// <summary>
    /// List available anonymization profiles
    /// </summary>
    [HttpGet("profiles")]
    public IActionResult GetProfiles()
    {
        var profiles = new[]
        {
            new { name = "basic", description = "Standard anonymization removing most identifiers" },
            new { name = "research", description = "Retains patient characteristics for research" },
            new { name = "internal", description = "Retains UIDs for internal tracking" },
            new { name = "clean", description = "Removes burned-in graphics and descriptions" }
        };

        return Ok(profiles);
    }
}

कॉन्फ़िगर करने योग्य प्रोफ़ाइल

प्रोफ़ाइलों को स्थापित करने की अनुमति दें appsettings.json:

{
  "AnonymizationProfiles": {
    "default": "basic",
    "profiles": {
      "basic": ["BasicProfile"],
      "research": ["BasicProfile", "RetainPatientChars"],
      "internal": ["RetainUIDs", "RetainDeviceIdent"],
      "clean": ["CleanGraph", "CleanDesc"],
      "maximum": ["BasicProfile", "CleanGraph", "CleanDesc"]
    }
  }
}

एक कॉन्फ़िगरेशन क्लास बनाएं और सेटिंग्स से पढ़ने के लिए सेवा को अपडेट करें:

public class AnonymizationProfileOptions
{
    public string Default { get; set; } = "basic";
    public Dictionary<string, string[]> Profiles { get; set; } = new();
}

// In Program.cs
builder.Services.Configure<AnonymizationProfileOptions>(
    builder.Configuration.GetSection("AnonymizationProfiles"));

सुरक्षा संबंधी विचारों के बारे में

इस सेवा को तैनात करते समय, इन सुरक्षा उपायों को लागू करें।

HTTPS को सक्षम करें यह सुनिश्चित करने के लिए कि सभी संचार ट्रांजिट में एन्क्रिप्ट किए जाते हैं. TLS 1.2 या उससे ऊपर सेट करें और HTTP को http में पुनर्निर्देशित करें.

अनुमोदित ग्राहकों तक पहुंच को सीमित करने के लिए JWT टोकन या एपीआई कुंजी का उपयोग करके कार्यान्वयन सत्यापन:

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class AnonymizeController : ControllerBase
{
    // Controller code...
}

**डिस्क पर एन्क्रिप्ट किए बिना मूल फ़ाइलों को संग्रहीत करने से बचें. जब संभव हो, और यदि अस्थायी भंडारण की आवश्यकता होती है, तो संदिग्ध वॉल्यूम का उपयोग करें.

सक्षम करें ऑडिट लॉगिंग सभी एनीमेशन ऑपरेशनों को ट्रैक करने के लिए, जिन लोगों ने उन्हें अनुरोध किया और जब:

_logger.LogInformation(
    "Anonymization completed - User: {User}, Profile: {Profile}, FileSize: {Size}",
    User.Identity?.Name, profile, file.Length);

प्रदर्शन ऑप्टिमाइज़ेशन (Performance Optimization)

कई तकनीकें उच्च प्रदर्शन परिदृश्यों के लिए प्रदर्शन में सुधार कर सकती हैं।

पृथ्वी में एनीमेशन का उपयोग करें जब आपको मूल डेटा को स्मृति में रखने की आवश्यकता नहीं है:

anonymizer.AnonymizeInPlace(dcm);

** बैच ऑपरेशन के लिए समानांतर प्रसंस्करण सक्षम करता है**:

[HttpPost("batch")]
public async Task<IActionResult> AnonymizeBatch(List<IFormFile> files)
{
    var results = await Parallel.ForEachAsync(
        files,
        new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
        async (file, ct) =>
        {
            using var stream = file.OpenReadStream();
            return await _anonymizationService.AnonymizeAsync(stream);
        });

    // Return results...
}

**RabbitMQ या Azure Service Bus जैसे एक संदेश क्यू का उपयोग करके बहुत बड़े बैट्स के लिए क्विंग अनुरोध लागू करें ताकि आप सेवा को अवरुद्ध किए बिना लोड स्पिक्स को संभाल सकें।

निष्कर्षों के लिए

अब आपके पास ASP.NET कोर में एक DICOM एनीमेशन माइक्रो सेवा का निर्माण करने के लिए एक पूर्ण ब्लूप्रिंट है. सेवा HTTP के माध्यम से डीआईसीओएम फ़ाइलों को स्वीकार करती है, Aspose.Medical का उपयोग करके कॉन्फ़िगर किए जा सकते हैं और अनुसंधान या साझा करने की तैयारी में डि-एन्जिट किए गए फाइलें वापस लाती है।

कुंजी कार्यों में रखरखाव के लिए परत आर्किटेक्चर का उपयोग करना शामिल है, लचीलापन के लिये कॉन्फ़िगर योग्य प्रोफाइल लागू करना, सत्यापन और एन्क्रिप्शन के साथ सेवा सुनिश्चित करना और समानांतर प्रसंस्करण के माध्यम से प्रदर्शन को अनुकूलित करना।

पूर्ण स्रोत कोड और अतिरिक्त उदाहरणों के लिए, देखें मेडिकल दस्तावेज - Medical Documentationआग की कोशिश करने के लिए, मुक्त अस्थायी लाइसेंस प्राप्त कर.

More in this category