我有一个用 Delphi XE 编写的 SOAP 服务器/客户端应用程序,在一段时间内工作正常,直到用户在企业代理/防火墙后面的 Windows 7 x64 上运行它。应用程序发送和接收请求中的 TSOAPAttachment 对象。
问题:
- 一旦收到并处理来自该用户的第一个请求,服务器就无法成功处理此后的任何请求(来自任何用户)。
- 服务器仍然响应请求,但请求的 SOAPAttachment 在该用户的第一个请求之后似乎已损坏,这就是它无法成功处理请求的原因。
- 将调试日志放入服务器后,我注意到请求参数中的 TSOAPAttachment.SourceStream 变得无法访问(或为空),并且 TSOAPAttachment.CacheFile 也为空。因此,每当尝试使用 SourceStream 时,都会返回访问冲突错误。
- 进一步调查发现,第一个请求在temp文件夹中生成的BorlandSoapAttachment(n)文件仍然存在并被锁定(当请求正常完成时应该将其删除),以及以下的BorlandSoapAttachment(n+1)文件请求堆积如山。
- 重新启动 IIS 或回收应用程序池后,SOAP 服务器将再次工作。
- 可以肯定的是,这是由代理或用户网络引起的,因为当同一台机器在该网络之外运行时,它会正常工作。
- 让问题更加神秘的是,在同一代理后面的 WinXP 上运行应用程序完全没有问题!
非常感谢任何帮助或建议,因为我们陷入这种情况已经有一段时间了。
提前非常感谢。
最佳答案
如果您确实确定已调试了处理附件的所有服务器逻辑,以尝试发现任何可能在 Windows 7 上失败的代码段,我建议:
1) 使用一些网络嗅探器 Wireshark is good for this task ,使用相同的数据/参数值发出两个后续请求,并比较 HTTP 内容。这种分析应该在客户端(查看数据是否总是以相同的内容离开客户端计算机)和服务器中完成,以分析传入的数据;
2)我过去也遇到过类似的情况,但我试图真正理解问题的尝试并没有成功。我解决了将文件作为 Base64 编码字符串参数发送的问题,并且不使用 SOAP 附件。使用 Base64 的副作用是要发送的数据大小增加了约 30%,如果您要传输大文件,这可能会很重要。
请记住,SOAP 附件会在服务器中创建临时文件,并且 Windows 7 的文件访问规则与 Windows XP 不同。我不知道这是否可以解释正在处理的第一个调用而不是其他调用,但也许有一些与文件访问有关的东西。
关于delphi - SOAP 服务器无法在某些代理/防火墙后面正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10747496/