在WCF DICOM代理服务上实现回调

时间:2013-11-25 13:20:51

标签: vb.net wcf dicom

我正在尝试使用WCF实现DICOM代理服务器。它是DICOM并不是很重要,除了它迫使我使用特定的进程来获取图像文件:在DICOM下,你在一个众所周知的IPAddress / Port上设置了一个监听器,它注册了一个ID(AETITLE)on一台服务器。然后,您将查询发送到该服务器,并且在将来的某个时间(或者可能永远不会),服务器将图像文件直接发送给您的监听器。

我的监听器将是代理上的一个方法,它将接收DICOM文件。

代理将使用WCF工作,从桌面客户端接收请求。在这种情况下,桌面客户端将使用WCF向代理发送请求,对于特定的研究UID(来自实际服务器的文件的GUID),我很高兴有该线程阻止来自代理的回复,直到文件到达监听器,我最终也可能使用回调 - 但同样的问题也适用。

所以:

Client                 Proxy                  DICOM Server
                         |RegisterListener--------->|
                         |
|Request(StudyID)------->|
|                        |Request StudyID---------->|
|                        |                          
|                        |<--------------Send(DICOM)|
|<----------Return(DICOM)|

我可以用一种模式或示例来实现这个吗?我假设我需要向发出请求的客户端注册一个指针(委托??),因此当侦听器从DICOM服务器获取文件时,代理知道哪个客户端返回映像?我可以制作一个字典(StudyUID,List(Of Delegate))或一些类似的结构来使其工作(将是List(Of Delegate),因为他们可能是多个客户请求相同的研究)?

或者让代理线程观看共享字典并等到该条目填充该文件是否更好? ie:有一个共享的(StudyID,DICOMFile)字典,由请求线程的客户端监控并由代理监听器填充?这会阻止我使用Async Callbacks。

欢迎任何建议。希望这不是太模糊......

1 个答案:

答案 0 :(得分:0)

我通过实现nettcp WCF服务解决了这个问题。该服务从客户端接受DICOM UID,然后将此和客户端会话存储在共享字典中。然后它注册一个DICOM监听器并向PACS服务器查询图像。

将图像返回给侦听器后,服务会从共享字典中的图像中查找UID,序列化图像并在返回图像的客户端上触发回调。

我仍有一些问题要解决,但总的来说这是有效的。

这个教程让我开始: http://www.codeproject.com/Articles/596287/Broadcasting-Events-with-a-Duplex-WCF-Service