DIMSE failure using multitenant plugin

I’m trying to get the new multitenant plugin running using the osimis/orthanc docker image.

I’ve configured the plugin in my config.json according to the Orthanc Book and it appears to be starting correctly:

orthanc_1        | I0626 09:37:48.747135 PluginsManager.cpp:161] (plugins) Orthanc SCP will *not* use DICOM TLS
orthanc_1        | I0626 09:37:48.747151 PluginsManager.cpp:161] (plugins) The embedded DICOM server will use 1 threads
orthanc_1        | I0626 09:37:48.747089 PluginsManager.cpp:161] (plugins) DICOM server started
orthanc_1        | W0626 09:37:48.747240 PluginsManager.cpp:157] Started multitenant DICOM server listening with AET C_AET2 on port: 4311

When I try sending something to the server using the additional AET & Port, I get the following error:

orthanc_1        | I0626 09:38:50.489514 PluginsManager.cpp:161] (plugins) Association Received from AET DCMSEND on IP 10.0.0.50
orthanc_1        | I0626 09:38:50.489660 PluginsManager.cpp:161] (plugins) Incoming connection from AET DCMSEND on IP 10.0.0.50, calling AET C_AET2
orthanc_1        | I0626 09:38:50.489707 PluginsManager.cpp:161] (plugins) Association Acknowledged (Max Send PDV: 16372) to AET DCMSEND on IP 10.0.0.50
orthanc_1        | I0626 09:38:50.489749 PluginsManager.cpp:161] (plugins) Finishing association with AET DCMSEND on IP 10.0.0.50: Data dictionary missing
orthanc_1        | I0626 09:38:50.489760 PluginsManager.cpp:161] (plugins) DIMSE failure (aborting association with AET DCMSEND on IP 10.0.0.50): Data dictionary missing

Manually setting an external dictionary using the DCMDICTPATH environment variable in the docker config doesn’t help either.

Hello,

Please could you share a minimal reproducible example so that we can investigate this issue?

Kind Regards,
Sébastien-

Hello,

Thank you for the quick reply.

Here’s my full configuration and log.

docker-compose.yaml:

version: "3.3"
services:
  orthanc:
    image: osimis/orthanc:latest
    ports:
      - 4242:4242
      - 4343:4343
      - 8042:8042
    environment:
      ORTHANC_NAME: "Orthanc"
      VERBOSE_ENABLED: "true"
      VERBOSE_STARTUP: "true"
      #DCMDICTPATH: /etc/orthanc/dicom.dic
    volumes:
      - ./orthanc.json:/etc/orthanc/orthanc.json:ro
      - ./orthanc-db/:/var/lib/orthanc/db/
      #- ./dicom.dic:/etc/orthanc/dicom.dic

orthanc.json:

{
	"Name" : "${ORTHANC_NAME}",

	"StorageDirectory": "/var/lib/orthanc/db",
	"IndexDirectory": "/var/lib/orthanc/db",

	"Plugins": ["/usr/share/orthanc/plugins", "/usr/local/share/orthanc/plugins"],

	"DicomServerEnabled": true,
    "DicomAet": "ORTHANC",
    "DicomCheckCalledAet": false,
    "DicomPort": 4242,
	"DicomModalitiesInDatabase": false,
    "DicomAlwaysAllowEcho": true,
    "DicomAlwaysAllowStore": true,
    "DicomCheckModalityHost": false,

	"RemoteAccessAllowed": true,
  	"SslEnabled": false,
	"AuthenticationEnabled": false,

	"MultitenantDicom" : {
		"Servers" : [
			{
				"AET" : "ORTHANC_2",
				"Port" : 4343,
				"Labels" : [ "TestLabel" ],
				"LabelsConstraint" : "All",
				"LabelsStoreLevels" : [ "Patient", "Study", "Series", "Instance" ]
			}
		]
	}
}

docker logs:

Attaching to multitenant_orthanc_1
orthanc_1  | Generating random hostid in /etc/hostid: e785a0b2
orthanc_1  | Discovering configuration files from /etc/orthanc/*.json
orthanc_1  | Discovering configuration files from /run/secrets/*.json
orthanc_1  | reading configuration from /etc/orthanc/orthanc.json
orthanc_1  | Analyzing environment variables
orthanc_1  | Analyzing secrets
orthanc_1  | going through all enabled plugins
orthanc_1  | Gdcm is enabled
orthanc_1  | Applying defaults for Gdcm plugin
orthanc_1  | Installing .so file for Gdcm plugin
orthanc_1  | Linked /usr/share/orthanc/plugins-available/libOrthancGdcm.so -> /usr/share/orthanc/plugins/libOrthancGdcm.so
orthanc_1  | MultitenantDicom is enabled
orthanc_1  | Installing .so file for MultitenantDicom plugin
orthanc_1  | Linked /usr/share/orthanc/plugins-available/libMultitenantDicom.so -> /usr/share/orthanc/plugins/libMultitenantDicom.so
orthanc_1  | OrthancExplorer2 is enabled
orthanc_1  | Applying defaults for OrthancExplorer2 plugin
orthanc_1  | Installing .so file for OrthancExplorer2 plugin
orthanc_1  | Linked /usr/share/orthanc/plugins-available/libOrthancExplorer2.so -> /usr/share/orthanc/plugins/libOrthancExplorer2.so
orthanc_1  | generated configuration file: {
orthanc_1  |   "Name": "${ORTHANC_NAME}",
orthanc_1  |   "StorageDirectory": "/var/lib/orthanc/db",
orthanc_1  |   "IndexDirectory": "/var/lib/orthanc/db",
orthanc_1  |   "Plugins": [
orthanc_1  |     "/usr/share/orthanc/plugins",
orthanc_1  |     "/usr/local/share/orthanc/plugins"
orthanc_1  |   ],
orthanc_1  |   "DicomServerEnabled": true,
orthanc_1  |   "DicomAet": "ORTHANC",
orthanc_1  |   "DicomCheckCalledAet": false,
orthanc_1  |   "DicomPort": 4242,
orthanc_1  |   "DicomModalitiesInDatabase": false,
orthanc_1  |   "DicomAlwaysAllowEcho": true,
orthanc_1  |   "DicomAlwaysAllowStore": true,
orthanc_1  |   "DicomCheckModalityHost": false,
orthanc_1  |   "RemoteAccessAllowed": true,
orthanc_1  |   "SslEnabled": false,
orthanc_1  |   "AuthenticationEnabled": false,
orthanc_1  |   "MultitenantDicom": {
orthanc_1  |     "Servers": [
orthanc_1  |       {
orthanc_1  |         "AET": "ORTHANC_2",
orthanc_1  |         "Port": 4343,
orthanc_1  |         "Labels": [
orthanc_1  |           "TestLabel"
orthanc_1  |         ],
orthanc_1  |         "LabelsConstraint": "All",
orthanc_1  |         "LabelsStoreLevels": [
orthanc_1  |           "Patient",
orthanc_1  |           "Study",
orthanc_1  |           "Series",
orthanc_1  |           "Instance"
orthanc_1  |         ]
orthanc_1  |       }
orthanc_1  |     ]
orthanc_1  |   },
orthanc_1  |   "HttpsCACertificates": "/etc/ssl/certs/ca-certificates.crt",
orthanc_1  |   "Gdcm": {
orthanc_1  |     "Throttling": 4,
orthanc_1  |     "RestrictTransferSyntaxes": [
orthanc_1  |       "1.2.840.10008.1.2.4.90",
orthanc_1  |       "1.2.840.10008.1.2.4.91",
orthanc_1  |       "1.2.840.10008.1.2.4.92",
orthanc_1  |       "1.2.840.10008.1.2.4.93"
orthanc_1  |     ]
orthanc_1  |   },
orthanc_1  |   "OrthancExplorer2": {
orthanc_1  |     "Enable": true,
orthanc_1  |     "IsDefaultOrthancUI": false
orthanc_1  |   }
orthanc_1  | }
orthanc_1  | generating temporary configuration file in /tmp/orthanc.json
orthanc_1  | Startup command: exec "Orthanc --verbose /tmp/orthanc.json"
orthanc_1  | W0626 10:54:22.955790 main.cpp:2034] Orthanc version: 1.12.0
orthanc_1  | I0626 10:54:22.956016 main.cpp:2066] Architecture: 64-bit, little endian
orthanc_1  | W0626 10:54:22.956205 OrthancConfiguration.cpp:57] Reading the configuration from: "/tmp/orthanc.json"
orthanc_1  | I0626 10:54:22.957117 Toolbox.cpp:1528] Using locale: "en_US.UTF-8" for case-insensitive comparison of strings
orthanc_1  | I0626 10:54:22.957385 Toolbox.cpp:1824] OpenSSL version: OpenSSL 3.1.0
orthanc_1  | I0626 10:54:22.958199 FromDcmtkBridge.cpp:294] (dicom) Using DCMTK version: 367
orthanc_1  | I0626 10:54:22.958381 FromDcmtkBridge.cpp:302] (dicom) Loading the embedded dictionaries
orthanc_1  | I0626 10:54:22.968885 FromDcmtkBridge.cpp:314] (dicom) Loading the embedded dictionary of private tags
orthanc_1  | I0626 10:54:22.975412 FromDcmtkBridge.cpp:2454] (dicom) Registering JPEG Lossless codecs in DCMTK
orthanc_1  | I0626 10:54:22.975589 FromDcmtkBridge.cpp:2462] (dicom) Registering JPEG codecs in DCMTK
orthanc_1  | I0626 10:54:22.975638 FromDcmtkBridge.cpp:2469] (dicom) Registering RLE codecs in DCMTK
orthanc_1  | I0626 10:54:22.975708 Enumerations.cpp:2358] Default encoding for DICOM was changed to: Latin1
orthanc_1  | I0626 10:54:22.984766 OrthancInitialization.cpp:380] Calling mallopt(M_ARENA_MAX, 5)
orthanc_1  | W0626 10:54:22.985069 main.cpp:911] Loading plugin(s) from: /usr/share/orthanc/plugins
orthanc_1  | I0626 10:54:22.985149 PluginsManager.cpp:280] (plugins) Scanning folder /usr/share/orthanc/plugins for plugins
orthanc_1  | I0626 10:54:22.985317 PluginsManager.cpp:303] (plugins) Found a shared library: "/usr/share/orthanc/plugins/libOrthancExplorer2.so"
orthanc_1  | W0626 10:54:22.986376 PluginsManager.cpp:261] Registering plugin 'orthanc-explorer-2' (version 0.9.3)
orthanc_1  | W0626 10:54:22.986738 PluginsManager.cpp:157] Root URI to the Orthanc-Explorer 2 application: /ui/
orthanc_1  | I0626 10:54:22.986784 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app/assets/(.*)
orthanc_1  | I0626 10:54:22.986884 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app/index.html
orthanc_1  | I0626 10:54:22.986971 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app/token-landing.html
orthanc_1  | I0626 10:54:22.987049 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app/retrieve-and-view.html
orthanc_1  | I0626 10:54:22.987129 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app/favicon.ico
orthanc_1  | I0626 10:54:22.987208 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app/(.*)
orthanc_1  | I0626 10:54:22.987295 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/app
orthanc_1  | I0626 10:54:22.987385 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/api/configuration
orthanc_1  | I0626 10:54:22.987469 OrthancPlugins.cpp:2713] (plugins) Plugin has registered a REST callback without mutual exclusion on: /ui/api/pre-login-configuration
orthanc_1  | I0626 10:54:22.987559 OrthancPlugins.cpp:2755] (plugins) Plugin has registered an OnChange callback
orthanc_1  | I0626 10:54:22.987618 PluginsManager.cpp:303] (plugins) Found a shared library: "/usr/share/orthanc/plugins/libOrthancGdcm.so"
orthanc_1  | W0626 10:54:22.997655 PluginsManager.cpp:261] Registering plugin 'gdcm' (version 1.5)
orthanc_1  | W0626 10:54:22.998030 PluginsManager.cpp:157] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.90
orthanc_1  | W0626 10:54:22.998085 PluginsManager.cpp:157] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.91
orthanc_1  | W0626 10:54:22.998134 PluginsManager.cpp:157] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.92
orthanc_1  | W0626 10:54:22.998171 PluginsManager.cpp:157] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.93
orthanc_1  | W0626 10:54:22.998219 PluginsManager.cpp:157] Throttling GDCM to 4 concurrent thread(s)
orthanc_1  | W0626 10:54:22.998265 PluginsManager.cpp:157] Version of GDCM: 3.0.10
orthanc_1  | I0626 10:54:22.998331 OrthancPlugins.cpp:2828] (plugins) Plugin has registered a callback to decode DICOM images (1 decoder(s) now active)
orthanc_1  | I0626 10:54:22.998430 OrthancPlugins.cpp:2841] (plugins) Plugin has registered a callback to transcode DICOM images (1 transcoder(s) now active)
orthanc_1  | I0626 10:54:22.998549 PluginsManager.cpp:303] (plugins) Found a shared library: "/usr/share/orthanc/plugins/libMultitenantDicom.so"
orthanc_1  | W0626 10:54:23.001913 PluginsManager.cpp:261] Registering plugin 'multitenant-dicom' (version 1.12.0)
orthanc_1  | I0626 10:54:23.002125 OrthancPlugins.cpp:2755] (plugins) Plugin has registered an OnChange callback
orthanc_1  | I0626 10:54:23.002484 PluginsManager.cpp:161] (plugins) Setting timeout for DICOM connections if Orthanc acts as SCP (server): 30 seconds (0 = no timeout)
orthanc_1  | W0626 10:54:23.002580 main.cpp:911] Loading plugin(s) from: /usr/local/share/orthanc/plugins
orthanc_1  | E0626 10:54:23.002718 PluginsManager.cpp:234] Inexistent path to plugins: /usr/local/share/orthanc/plugins
orthanc_1  | W0626 10:54:23.002816 OrthancInitialization.cpp:420] SQLite index directory: "/var/lib/orthanc/db"
orthanc_1  | W0626 10:54:23.003493 OrthancInitialization.cpp:519] Storage directory: "/var/lib/orthanc/db"
orthanc_1  | I0626 10:54:23.007000 SQLiteDatabaseWrapper.cpp:1399] Version of the Orthanc database: 6
orthanc_1  | W0626 10:54:23.007137 HttpClient.cpp:1194] HTTPS will use the CA certificates from this file: /etc/ssl/certs/ca-certificates.crt
orthanc_1  | I0626 10:54:23.007263 HttpClient.cpp:515] (http) Setting the default timeout for HTTP client connections: 0 seconds
orthanc_1  | I0626 10:54:23.007381 HttpClient.cpp:499] (http) Setting the default proxy for HTTP client connections:
orthanc_1  | I0626 10:54:23.007460 DicomAssociationParameters.cpp:376] (dicom) Default timeout for DICOM connections if Orthanc acts as SCU (client): 10 seconds (0 = no timeout)
orthanc_1  | I0626 10:54:23.007760 ServerIndex.cpp:289] Starting the database flushing thread (sleep = 10 seconds)
orthanc_1  | I0626 10:54:23.007956 LuaJobManager.cpp:68] (lua) Lua: DICOM associations will be closed after 5 seconds of inactivity
orthanc_1  | I0626 10:54:23.008104 LuaScripting.cpp:774] Initializing Lua for the event handler
orthanc_1  | W0626 10:54:23.008314 LuaContext.cpp:94] Lua says: Lua toolbox installed
orthanc_1  | I0626 10:54:23.008489 LuaJobManager.cpp:68] (lua) Lua: DICOM associations will be closed after 5 seconds of inactivity
orthanc_1  | I0626 10:54:23.008589 LuaScripting.cpp:774] Initializing Lua for the event handler
orthanc_1  | W0626 10:54:23.008742 LuaContext.cpp:94] Lua says: Lua toolbox installed
orthanc_1  | I0626 10:54:23.008874 ServerContext.cpp:399] Automated transcoding of incoming DICOM instances is disabled
orthanc_1  | I0626 10:54:23.008962 ServerContext.cpp:406] (dicom) Deidentification of log contents (notably for DIMSE queries) is enabled
orthanc_1  | I0626 10:54:23.009025 ServerContext.cpp:410] (dicom) Version of DICOM standard used for deidentification is 2021b
orthanc_1  | I0626 10:54:23.009271 ServerContext.cpp:429] (dicom) Preferred transfer syntax for Orthanc C-STORE SCU: 1.2.840.10008.1.2.1
orthanc_1  | I0626 10:54:23.009283 ServerIndex.cpp:446] Starting the monitor for stable resources (stable age = 60)
orthanc_1  | I0626 10:54:23.009490 DcmtkTranscoder.cpp:76] Quality for lossy transcoding using DCMTK is set to: 90
orthanc_1  | W0626 10:54:23.009545 ServerContext.cpp:515] Disk compression is disabled
orthanc_1  | I0626 10:54:23.009623 ServerContext.cpp:1290] Storing MD5 for attachments: yes
orthanc_1  | W0626 10:54:23.009732 ServerIndex.cpp:381] No limit on the number of stored patients
orthanc_1  | W0626 10:54:23.009826 ServerIndex.cpp:401] No limit on the size of the storage area
orthanc_1  | W0626 10:54:23.009877 ServerIndex.cpp:420] Maximum Storage mode: Recycle
orthanc_1  | W0626 10:54:23.010246 ServerContext.cpp:244] Reloading the jobs from the last execution of Orthanc
orthanc_1  | W0626 10:54:23.010454 JobsEngine.cpp:272] The jobs engine has started with 2 threads
orthanc_1  | I0626 10:54:23.010454 JobsEngine.cpp:126] (jobs) Worker thread 0 has started
orthanc_1  | I0626 10:54:23.010642 DicomServer.cpp:134] (dicom) Setting timeout for DICOM connections if Orthanc acts as SCP (server): 30 seconds (0 = no timeout)
orthanc_1  | I0626 10:54:23.010880 DicomServer.cpp:422] (dicom) Orthanc SCP will *not* use DICOM TLS
orthanc_1  | I0626 10:54:23.010984 DicomServer.cpp:430] (dicom) The embedded DICOM server will use 4 threads
orthanc_1  | W0626 10:54:23.011246 main.cpp:1317] DICOM server listening with AET ORTHANC on port: 4242
orthanc_1  | I0626 10:54:23.011268 DicomServer.cpp:64] (dicom) DICOM server started
orthanc_1  | I0626 10:54:23.011440 HttpServer.cpp:1604] (http) This Orthanc server uses CivetWeb as its embedded HTTP server
orthanc_1  | I0626 10:54:23.011519 HttpServer.cpp:2112] (http) The embedded HTTP server will use 50 threads
orthanc_1  | I0626 10:54:23.011647 HttpServer.cpp:1953] (http) HTTP keep alive is enabled
orthanc_1  | I0626 10:54:23.011745 HttpServer.cpp:1967] (http) HTTP keep alive Timeout is now 1 seconds
orthanc_1  | W0626 10:54:23.011828 HttpServer.cpp:2036] HTTP compression is enabled
orthanc_1  | I0626 10:54:23.011941 HttpServer.cpp:2125] (http) TCP_NODELAY for the HTTP sockets is set to true
orthanc_1  | I0626 10:54:23.012014 HttpServer.cpp:2145] (http) Request timeout in the HTTP server is set to 30 seconds
orthanc_1  | W0626 10:54:23.012145 main.cpp:1048] ====> Remote access is enabled while user authentication is explicitly disabled, your setup is POSSIBLY INSECURE <====
orthanc_1  | I0626 10:54:23.012238 main.cpp:1161] Version of Lua: Lua 5.4
orthanc_1  | W0626 10:54:23.012343 main.cpp:1172] Remote LUA script execution is disabled
orthanc_1  | W0626 10:54:23.012395 main.cpp:1184] REST API can not write to the file system.
orthanc_1  | I0626 10:54:23.012468 HttpServer.cpp:2192] (http) Branching WebDAV bucket at: /webdav
orthanc_1  | I0626 10:54:23.012540 HttpServer.cpp:1649] (http) Starting embedded Web server using Civetweb
orthanc_1  | I0626 10:54:23.013902 OrthancWebDav.cpp:1696] Starting the WebDAV upload thread
orthanc_1  | W0626 10:54:23.014025 HttpServer.cpp:1794] HTTP server listening on port: 8042 (HTTPS encryption is disabled, remote access is allowed)
orthanc_1  | W0626 10:54:23.014263 main.cpp:923] Orthanc has started
orthanc_1  | I0626 10:54:23.014339 OrthancPlugins.cpp:3146] (plugins) Plugin making REST GET call on URI /plugins (built-in API)
orthanc_1  | I0626 10:54:23.014578 OrthancPlugins.cpp:3146] (plugins) Plugin making REST GET call on URI /plugins/gdcm (built-in API)
orthanc_1  | I0626 10:54:23.014736 OrthancPlugins.cpp:3146] (plugins) Plugin making REST GET call on URI /plugins/multitenant-dicom (built-in API)
orthanc_1  | I0626 10:54:23.014946 OrthancPlugins.cpp:3146] (plugins) Plugin making REST GET call on URI /plugins/orthanc-explorer-2 (built-in API)
orthanc_1  | I0626 10:54:23.015201 PluginsManager.cpp:161] (plugins) Orthanc SCP will *not* use DICOM TLS
orthanc_1  | I0626 10:54:23.015276 PluginsManager.cpp:161] (plugins) The embedded DICOM server will use 1 threads
orthanc_1  | W0626 10:54:23.015453 PluginsManager.cpp:157] Started multitenant DICOM server listening with AET ORTHANC_2 on port: 4343
orthanc_1  | I0626 10:54:23.015470 PluginsManager.cpp:161] (plugins) DICOM server started
orthanc_1  | I0626 10:54:23.015512 LuaScripting.cpp:868] Starting the Lua engine
orthanc_1  | I0626 10:54:23.015725 JobsEngine.cpp:126] (jobs) Worker thread 1 has started

+++ error starting here +++

orthanc_1  | I0626 10:54:27.340431 PluginsManager.cpp:161] (plugins) Association Received from AET DCMSEND on IP 10.0.0.50
orthanc_1  | I0626 10:54:27.340522 OrthancPlugins.cpp:3146] (plugins) Plugin making REST GET call on URI /tools/accepted-transfer-syntaxes (built-in API)
orthanc_1  | I0626 10:54:27.340771 PluginsManager.cpp:161] (plugins) Incoming connection from AET DCMSEND on IP 10.0.0.50, calling AET ORTHANC_2
orthanc_1  | I0626 10:54:27.340865 PluginsManager.cpp:161] (plugins) Association Acknowledged (Max Send PDV: 16372) to AET DCMSEND on IP 10.0.0.50
orthanc_1  | I0626 10:54:27.340959 PluginsManager.cpp:161] (plugins) Finishing association with AET DCMSEND on IP 10.0.0.50: Data dictionary missing
orthanc_1  | I0626 10:54:27.340972 PluginsManager.cpp:161] (plugins) DIMSE failure (aborting association with AET DCMSEND on IP 10.0.0.50): Data dictionary missing

+++ error ending here +++

orthanc_1  | I0626 10:58:58.386842 CommandDispatcher.cpp:333] (dicom) Association Received from AET DCMSEND on IP 10.0.0.50
orthanc_1  | I0626 10:58:58.387992 main.cpp:318] Incoming connection from AET DCMSEND on IP 10.0.0.50, calling AET ORTHANC_2
orthanc_1  | I0626 10:58:58.389368 CommandDispatcher.cpp:666] (dicom) Association Acknowledged (Max Send PDV: 16372) to AET DCMSEND on IP 10.0.0.50
orthanc_1  | I0626 10:58:58.395396 main.cpp:353] Incoming Store request from AET DCMSEND on IP 10.0.0.50, calling AET ORTHANC_2
orthanc_1  | I0626 10:58:58.416333 FilesystemStorage.cpp:125] Creating attachment "e2f0179e-a60f-46e5-a645-001ee0b1622c" of "DICOM" type (size: 1MB)
orthanc_1  | I0626 10:58:58.420881 ServerContext.cpp:683] New instance stored
orthanc_1  | I0626 10:58:58.424824 CommandDispatcher.cpp:931] (dicom) Finishing association with AET DCMSEND on IP 10.0.0.50: DUL Peer Requested Release
orthanc_1  | I0626 10:58:58.425010 CommandDispatcher.cpp:939] (dicom) Association Release with AET DCMSEND on IP 10.0.0.50

dcmsend gives me the following output:

dcmsend orthanc 4343 -aec ORTHANC_2 ".\test.ima"
E: Failed sending C-STORE request: 0006:020e DIMSE Failed to send message
E: 0006:031d TCP I/O Error (Eine vorhandene Verbindung wurde vom Remotehost geschlossen.) occurred in routine: writeDataPDU
F: cannot send SOP instance: DIMSE Failed to send message
F: 0006:031d TCP I/O Error (Eine vorhandene Verbindung wurde vom Remotehost geschlossen.) occurred in routine: writeDataPDU
E: Association Abort Failed: 0006:031d TCP I/O Error (Eine vorhandene Verbindung wurde vom Remotehost geschlossen.) occurred in routine: sendAbortTCP

The Container is newly built and running on a Ubuntu 22.04 host system.

In the log above, I’ve sent a dicom file to port 4343, which produced the previously mentioned error.
Afterwards sending to the “main” port 4242 works normally though.

I also have the same issue when using the jodogne/orthanc-python:latest docker image.

A sample DICOM file, as well as command-line prompts to reproduce the issue, are missing in your previous message.

Sorry about that.

the container was started with:

sudo docker-compose up -d

testfiles were sent to the orthanc server from a windows machine using dmcsend.
The current DCMTK binaries for windows x64 from this link were used: Download DCMTK-Tools - dicom.offis.de:

dcmsend orthanc 4343 -aec ORTHANC_2 "./testfile.dcm"

I tested it using multiple images from different modalities made by different companies, that I sadly can’t upload here due to being a new user.
Here’s a link for two of the files I used to test this: https://we.tl/t-9iDRnX88Af

I did some more testing yesterday evening.

I also have the same problem, when downloading and running the v1.12.0 or mainline binaries from lsb.orthanc-server.com outside of a docker container, but everything works fine when executing locally compiled source code.

I also noticed that the 1.12.0 source download on www.orthanc-server.com is missing a line of code that is present in the current version on the Hg repository:

Orthanc::FromDcmtkBridge::InitializeDictionary(false /* loadPrivateDictionary */);

But receiving dicom files works with or without that line present, as long as the source is compiled locally.

Hi Fabian,

I finally looked at your issue. Indeed, there is a different behavior between static builds (LSB and probably when you build on your machine) and dynamic builds (in osimis/orthancDocker images). The dictionary is not loaded by the plugin in dynamic builds.

I have fixed that in this commit. @jodogne for review since you have a better understanding than myself on this topic.

Best regards,

Alain.

Hello @alainmazy, yes, I confirm that @f.freudensprung’s fix is the proper way to solve this issue. The line was present during my prototyping of the plugin, but I visibly forgot to commit it to the final version of the plugin. Sorry for the inconvenience.