1

我正在开发一个需要与Web 服务器C# mobile进行主要交互的应用程序。PHP但是,应用程序还需要支持“离线模式”,因为连接将通过cellular network. 该网络可能会随机丢弃请求。我在以前的“离线模式”应用程序中遇到的问题是,当请求导致超时时,服务器可能已经或可能尚未处理该请求。如果多次发送请求会创建重复,这是一个问题。我正在经历这个并想出了以下想法。

  • 移动设置一个标头值,例如UniqueRequestID: 1与请求一起发送。
  • 收到请求后,PHP 服务器将添加UniqueRequestID到当前用户会话中$_SESSION['RequestID'][] = $headers['UniqueRequestID'];
  • 服务器实现了一个 GetRequestByID,如果id当前会话存在则返回 true,否则返回 false。或者,这可以返回请求的缓存结果。

这似乎是一种查看请求是否成功联系服务器的可靠方法。在移动设备中,重新连接到服务器后,我们会检查是否收到了请求。如果是这样,请跳过该待处理offline message并转到下一个。

问题 我在这里重新发明了轮子吗?这种方法是否容易失败(或者我会陷入困境)?有没有更好的方法/替代方案?

-我在这里向其他开发人员推销这个,我们认为这似乎很简单,暗示这个“系统”可能已经存在于某个地方。

-如果我的 Google 技能今天不及格,我深表歉意。

4

1 回答 1

1

正如您正确指出的那样,这个问题并不新鲜。已经多次尝试在不同层次上解决它。

运输层

HTTP 传输协议本身不提供任何可靠数据传输的机制。原因之一是 HTTP 是无状态的,不太关心以前的请求和响应。IBM 曾尝试制作一种基于 HTTP 的称为 HTTPR 的可靠传输协议,但从未流行起来。你可以在这里阅读更多关于它的信息。

消息级别

大多数 Web 服务仍然使用 HTTP 作为传输协议,并在其上使用 SOAP 消息传递协议。当应用程序级消息传递协议还必须保证某种程度的可靠性和安全性时,基于 HTTP 的 SOAP 是不够的。这就是引入协议的原因WS-ReliabilityWS-ReliableMessaging协议。这些协议允许在存在软件组件、系统或网络故障的情况下在分布式应用程序之间可靠地传递 SOAP 消息。同时,它们提供了额外的安全性。您可以在此处此处阅读有关这些协议的更多信息。

您的解决方案

如果您需要一种简单的方法来确保消息尚未被处理,我想您的方法没有任何问题。我建议使用数据库而不是会话来存储每个请求的处理结果。如果您使用$_SESSION['RequestID'][],如果会话丢失(用户在特定时间离线,服务器重新启动或崩溃等),您将遇到麻烦。此外,如果您使用数据库而不是会话,则以后只需添加额外的 Web 服务器就可以更轻松地进行扩展。

于 2014-02-11T16:03:37.567 回答