通过已知端口进行服务器间通信

时间:2011-05-06 12:21:46

标签: c# .net wcf msmq .net-remoting

我们的产品系统包含一个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公开了哪些其他功能(如果有的话),允许通过已知端口在服务器之间进行通信?

3 个答案:

答案 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