我们的产品系统包含一个IIS 6.0服务器,后面是一个Java SOA服务器,后面是一个Oracle数据库服务器。
由于各种原因,我们需要在Java SOA服务器上运行的Windows服务,该服务存储与GUID关联的不透明blob。这是界面的简化版本:
interface IBlobService
{
void PutBlob(Guid key, byte[] data);
byte[] GetBlob(Guid key);
}
IBlobService的主要用户是在IIS服务器上运行的Web前端。我们可以通过自定义端口使用WCF或.NET远程处理来实现服务器之间的通信。但是,我们的申请受到严格的认证要求。我们非常希望使用已知端口进行通信,而不是使用自定义端口。
我们不能使用命名管道,因为我们需要在服务器之间进行通信。 我们考虑使用MSMQ,因为它使用已知端口,但MSMQ将消息大小限制为4 MB。我们需要转移远远超过这个 - 最多60 MB。
.NET公开了哪些其他功能(如果有的话),允许通过已知端口在服务器之间进行通信?
答案 0 :(得分:1)
如果您使用的是WCF,则可以使用HTTP / HTPS。您也可以在任何您喜欢的端口上使用原始tcp。例如只是因为端口80是标准的http端口并不意味着你不能在该端口上运行其他协议,只要服务器没有使用它。
答案 1 :(得分:1)
这个答案没有解决问题中的问题,而是提出了一种避免问题的替代方法。
经过深思熟虑后,并不要求blob服务作为Windows服务运行。相反,可以在Java应用程序服务器中托管实现数据的RESTful接口的普通Java servlet。这将绕过SOAP堆栈和XML开销,同时利用Java应用程序服务器的监控功能。
数据可以用
存储PUT https://java-app-server.example.com/blobService/b12a0403-... HTTP/1.1
Content-Length: <LENGTH OF BLOB>
Content-Type: application/octet-stream
<BLOB>
后来用
检索GET https://java-app-server.example.com/blobService/b12a0403-... HTTP/1.1
返回
Content-Length: <LENGTH OF BLOB>
Content-Type: application/octet-stream
<BLOB>
答案 2 :(得分:1)
如果 MSMQ是首选设施,我会将数据分块并重新组装。
邮件正文的内容是不透明的,因此包括每个块数据(如id,sequence,size和CRC)都是可能的。
您可能需要考虑WCF二进制流。请参阅MSDN上的这篇文章:http://msdn.microsoft.com/en-us/library/ms733742.aspx