阻止多次上传

上传文件时,BITS 会创建一个会话 ID,用于标识 BITS 客户端和 BITS 服务器的上传会话。 如果 BITS 客户端和服务器之间的连接在 BITS 上传文件时断开,客户端将使用会话 ID 尝试恢复上传。

如果 BITS 客户端连接到与以前相同的服务器,服务器将识别会话 ID,上传将从中断点恢复。 但是,如果客户端连接到不同的服务器,则客户端必须从头开始上传,因为新服务器没有会话上下文或先前上传的数据。 当 BITS 服务器托管在 Web 场上并且未设置 BITS IIS 扩展属性 BITSHostId 时,BITS 可能会连接到其他服务器。 BITSHostId 属性通过强制 BITS 客户端连接到前一个服务器的唯一地址而不是共享服务器地址来防止重启。

BITS 服务器将尝试仅向服务器应用程序发送一次上传文件,但文件可能会发送多次。 例如,如果 BITS 服务器将文件发送到服务器应用程序,然后在等待来自服务器应用程序的答复时终止,则可能会发生这种情况。 BITS 客户端将收到 HTTP 层的错误代码,并在延迟后重试上传。 如果服务器保持脱机时间超过 BITSHostIdFallbackTimeout 超时时间,则客户端最终将再次向共享服务器地址发送请求;其他 BITS 服务器将接收文件,并再次将其传送到服务器应用程序。

即使使用单个前端服务器,也可能出现类似的情况。 例如,当客户端将整个文件上传到服务器时,最终块导致服务器将文件转发给服务器应用程序。 如果 BITS 服务器或服务器应用程序在文件处理后但在确认发送到客户端之前终止,则客户端将收到错误代码,稍后重试。 当客户端重试时,BITS 服务器将看到最终块已上传,并将再次将文件转发到服务器应用程序。 如果多次接收上传文件对服务器应用程序来说是个问题,则应该考虑在数据中包含事务标识符。