我如何在客户端知道HTTP处理程序何时完成处理?

时间:2020-03-06 14:55:03  来源:igfitidea点击:

一个简单的解决方案可能是一个漫长的问题,但是这里...

我有一个定制的Silverlight控件,用于选择多个文件并将其发送到服务器。它使用WebCLient控件的OpenWriteAsync方法将文件发送到常规处理程序(FileReciever.ashx)。

基本上,silverlight代码对每个文件执行以下操作:

WebClient client = new WebClient();
client.OpenWriteCompleted += (sender, e) =>
  {
    PushData(data, e.Result);
    e.Result.Close();
    data.Close();
  };
client.OpenWriteAsync(handlerUri);

服务器端处理程序仅读取传入的流,然后对结果字节数组进行更多处理。

问题是,一旦所有数据都通过网络发送,就完成了客户端OpenWriteCompleted。然后,我的代码将与下一个文件保持一致。我真正想要的是等到ASHX处理程序完成对该请求的所有处理。我怎么做? WebClient上是否有任何等待机制?我可以在处理程序中的HttpContext上执行任何回调吗?我应该使用其他传输方式吗?请指教!

解决方案

嗯,也许一个简单的解决方案就是用GUID标记ur​​l(该guid在每个文件中都是唯一的,或者可以进行传输,而这对情况而言是有意义的)。然后,我们可以拥有另一个简单的Web服务,该服务能够基于guid来检查另一个服务的状态,并让Silverlight客户端查询该新服务的处理状态(通过将新的Web服务传递给该guid的guid)。过去的转让)。

我假设我们担心从处理程序返回的数据将花费很长时间进行传输,并且在这段时间内服务器没有被利用。没有办法告诉服务器何时完成处理,因此我认为我们可以在不更改体系结构的情况下做到这一点。

我只会让处理程序具有某种标识符(例如GUID或者int),该标识符可用于在另一个请求中检索处理程序的结果。因此,页面将调用处理程序,处理程序将存储结果并返回标识符,页面将第二次调用处理程序,然后调用另一个处理程序以获取第一次调用的结果。这样可以在传输数据时保持服务器的使用状态。

或者,如果我们不介意使用JavaScript,则可以使用JavaScript(jQuery)来实现。

如果文件不是很大,并且可以将每个文件都保留在内存中,那么一种难看而有效的解决方案是将它们转换为字符串,然后使用UploadStringAsync方法发送它们。

如果文件大小不受限制,则避免使用此方法,但是如果我们现在可以将它们变得相对较小,则可以使用此方法。