我正在处理C# mobile
应用程序,该应用程序需要与PHP
Web服务器进行重要交互。但是,应用程序还需要支持“脱机模式”,因为连接将超过cellular network
。该网络可能会随机丢弃请求。我之前使用“离线模式”应用程序遇到的问题是,当请求导致超时时,服务器可能已经或可能没有处理过该请求。如果多次发送请求会产生重复,这是一个问题。我正在走过这一步,提出了以下想法。
UniqueRequestID: 1
。UniqueRequestID
添加到当前用户会话$_SESSION['RequestID'][] = $headers['UniqueRequestID'];
id
则返回true,否则返回false。或者,这可以返回请求的缓存结果。这似乎是一种可靠的方式来查看请求是否成功联系了服务器。在移动设备中,重新连接到服务器后,我们会检查是否收到了请求。如果是,请跳过暂挂的offline message
并转到下一个。
问题 我在这里重新发明了轮子吗?这种方法是否容易失败(或者我是否会陷入兔子洞)?有更好的方式/替代方案吗?
- 我正在向其他开发者推销这个,我们认为这似乎非常简单,暗示这个“系统”可能已经存在于某个地方。
- 道歉,如果我的Google技能今天让我失望了。
答案 0 :(得分:1)
正如您所说,这个问题并不新鲜。已经多次尝试在不同层面解决它。
传输级别
HTTP传输协议本身不提供任何可靠的数据传输机制。其中一个原因是HTTP是无状态的,并且不关心以前的请求和响应。 IBM已经尝试制定一种基于HTTP的可靠传输协议HTTPR,但它从未受到欢迎。您可以阅读更多相关信息here。
消息传递级别
大多数Web服务仍然使用HTTP作为传输协议和SOAP消息传递协议。当应用程序级消息传递协议还必须保证某种程度的可靠性和安全性时,SOAP over HTTP是不够的。这就是引入WS-Reliability
和WS-ReliableMessaging
协议的原因。这些协议允许在存在软件组件,系统或网络故障的情况下在分布式应用程序之间可靠地传递SOAP消息。同时它们提供额外的安全性。您可以详细了解这些协议here和here。
您的解决方案
如果您需要一种简单的方法来确保消息尚未处理,我认为您的方法没有任何问题。我建议使用数据库而不是session来存储每个请求的处理结果。如果您使用$_SESSION['RequestID'][]
,如果会话丢失(用户在特定时间离线,服务器重新启动或崩溃等),您将遇到麻烦。此外,如果您使用数据库而不是会话,则可以稍后通过添加额外的Web服务器来轻松扩展。