10

我正在重新设计一个我继承的应用程序,它将数码照片从笔记本电脑发送到网络服务器。这个想法是“在现场”拍摄照片并立即将它们发布在网页上(具有一些更花哨的功能)。

典型场景
1. 使用标准 USB 将照片从相机传输到笔记本电脑。
2.照片经过各种处理。(不重要)
3. 每张照片都使用 Web 请求以小块(每张约 64 kb)的形式发布到标准 Apache 网络服务器,然后再次合并在一起。

当前设计的问题是,当网络连接不可靠时,它经常会挂起。由于我们使用的是移动网络 (3G),并且经常无法覆盖,因此我需要一种方法来正确处理此问题。

我的问题是是否有更好的解决方案可以在连接不时断开时不会使应用程序挂起。

(额外的问题是如何在不必带着笔记本电脑徒步旅行的情况下进行正确的单元测试。)

编辑 2008-11-24:我现在已经设法使用 NetLimiter 和 TMnetsim(免费软件)的组合为此设置了一个适当的测试环境。我尝试设置 5 kb/sec 并丢弃所有数据包的 1% - 我的应用程序仍然适用于新设计。

编辑 2008-12-11:只是为了更新我是如何做到这一点的。我创建了一个后台工作人员(如下所示),每当检测到相机时就会启动该工作人员,以将照片从相机复制到 PC。然后,当文件到达 PC 以使用异步 HTTP 传输上传时,我启动了另一个后台工作人员。把所有事情都做好肯定很痛苦,特别是因为操作应该随时“可取消”……但无论如何,现在它可以工作了。非常感谢所有帮助过我的人!

4

7 回答 7

2

我会避免在任何具有 UI 的线程中使用 HTTP,除非你真的想阻塞直到收到响应。您可以尝试使用后台线程中的相同逻辑,该线程将根据需要运行。只要确保有逻辑可以检测连接何时丢失(可能是超时),并会定期(但不频繁)重试,直到再次连接。

您最好的选择是创建某种后台工作进程,一旦将照片保存到设备上的保管箱目录,就会上传照片。我会说虽然创建一个基于 .NET 的后台进程并非易事。

于 2008-11-30T07:21:12.473 回答
1

首先找出它为什么挂起 - 请求只是在那里吗?他们超时了吗?如果降低超时设置会发生什么?

你是从 UI 线程做 POST 吗?(不要那样做:)

您也可以通过以非常短的超时时间发出心跳请求来检测连接断开。

于 2008-11-11T12:31:14.963 回答
1

您可能需要使用WebRequest.BeginGetResponse而不是 WebRequest.GetResponse,尽管似乎没有办法取消响应(也许处理 WebRequest 会有所帮助)。

此外,您可以尝试使用WebRequest的Timeout属性

于 2008-11-11T13:11:56.160 回答
1

一种无需将笔记本电脑带入现场即可进行测试的方法:在备用机器上尝试m0n0wall,并设置其防火墙规则以压缩带宽并丢弃数据包。

或者,在您的服务器/客户端上安装netlimiter

于 2008-11-11T13:34:54.443 回答
0

首先,我会将转移过程放在应用程序之外。使用允许它从上次传输中间重新开始传输的实用程序同步文件。

您可以使用某种类型的法拉第笼模拟通信中断。

于 2008-11-11T12:34:57.280 回答
0

你看过同步框架吗?

希望它有所帮助,布鲁诺·菲格雷多

于 2008-11-11T12:42:39.713 回答
0

我会尝试将 ASP.NET 缓存技术与 ADO.NET 同步服务一起用于数据传输。

尝试先将图像缓存为二进制或 BLOB 格式,然后将它们存储在本地 CE 数据库(或 Express)中。然后通过 WebServices 将数据同步到中央服务器数据库。

尝试创建一个集中式 Web 服务来处理您的缓存图像传输。

Web 服务将在“偶尔连接”的场景中通过同步服务接收数据。

对于单元测试,请尝试在拨号连接上使用虚拟机 (VMware) 或笔记本电脑。

于 2008-12-01T00:40:05.917 回答