سازمان های مراقبت های بهداشتی به طور فزاینده ای نیاز به راه حل های اتوماتیک برای شناسایی داده های تصویر پزشکی دارند.در این راهنمای، شما یاد خواهید گرفت که چگونه یک سرویس مایکروسافت ناشناس سازی DICOM را در ASP.NET Core** بسازید که فایل های دیکوم را از طریق HTTP دریافت می کند، آنها را با استفاده از پروفایل های قابل تنظیم ناخودآگاه می سازد و نتایج ناشناخته را باز می گرداند.

جدول محتوا

نظارت بر معماری

مایکروسافت یک معماری طبقه بندی شده با جدایی واضح از نگرانی ها را دنبال می کند. لایه API درخواست ها و پاسخ های HTTP را از طریق کنترلرهای هسته ای ASP.NET مدیریت می کنند. لوله سرویس حاوی منطق کسب و کار با استفاده از Aspose.Medical Anonymizer است.

این معماری امکان مقیاس افقی، آزمایش آسان و ادغام ساده با سیستم های اطلاعاتی بیمارستان و سرورهای PACS را فراهم می کند.

تنظیم پروژه

شروع با ایجاد یک پروژه جدید ASP.NET Core Web API و نصب بسته مورد نیاز:

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

یک کنترلر ایجاد کنید که فایل ها را بارگذاری می کند و فایل های DICOM ناشناس را باز می گرداند:

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"));

نظارت بر امنیت (#Security Considerations)

در هنگام راه اندازی این سرویس، این اقدامات امنیتی را اجرا کنید.

HTTPS را فعال کنید تا اطمینان حاصل شود که تمام ارتباطات در ترافیک رمزگذاری شده است. TLS 1.2 یا بالاتر را تنظیم کنید و HTTP را به https هدایت کنید.

تولید اعتباربخشی با استفاده از توکن های JWT یا کلیدهای API برای محدود کردن دسترسی به مشتریان مجاز:

[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 برای مقابله با خطوط بار بدون غلبه بر سرویس، درخواست اجرا می شود.

نتیجه گیری #تصمیم گیری

شما در حال حاضر یک طرح کامل برای ساخت یک DICOM anonymization microservice در ASP.NET Core. این سرویس می پذیرد فایل های دایکوم از طریق HTTP، اعمال پروفایل های ناشناس سازی قابل تنظیم با استفاده از Aspose.Medical، و بازگرداندن فایلهای غیر شناسایی آماده برای تحقیق و یا به اشتراک گذاری.

وظایف کلیدی شامل استفاده از معماری لایه ای برای نگهداری، پیاده سازی پروفایل های قابل تنظیم برای انعطاف پذیری، اطمینان از خدمات با اعتباربخشی و رمزگذاری و بهینه سازی عملکرد با پردازش موازی است.

برای کد منبع کامل و نمونه های اضافی، به بایگانی برچسب ها: مستندات پزشکیبرای استفاده از آتش سوزی، یک مجوز موقت رایگان دریافت کنید.

More in this category