【问题标题】:How can I know on the client side when the HTTP handler is done processing?当 HTTP 处理程序完成处理时,我如何在客户端知道?
【发布时间】:2008-09-30 11:18:28
【问题描述】:

对于一个简单的解决方案来说可能是一个很长的问题,但这里是......

我有一个定制的 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 进行任何回调吗?我应该使用其他类型的传输技术吗?请指教!

【问题讨论】:

    标签: silverlight webclient ashx


    【解决方案1】:

    Silverlight forums 中也提出了同样的问题。微软认可的答案是,你不能用 WebClient 和 OpenWriteAsync 做到这一点。您需要使用 UploadStringAsync 或 HttpWebRequest。

    【讨论】:

      【解决方案2】:

      Hrm,也许一个简单的解决方案可能是使用 GUID 标记 url(每个文件的 guid 是唯一的,或者传输,只要对您的情况有意义)。然后,您可以拥有另一个简单的 Web 服务,该服务能够根据 guid 检查其他服务的状态,并让您的 silverlight 客户端查询该新服务的处理状态(通过将新的 Web 服务传递给过去的转移)。

      【讨论】:

      • 类似的东西可能会起作用 - 但我希望有另一种方法,内置的东西,不涉及这样的单独服务。
      【解决方案3】:

      我假设您担心从处理程序返回的数据需要很长时间才能传输,并且在此期间没有使用服务器。没有办法知道服务器何时完成处理,所以我认为你不能在不改变架构的情况下做到这一点。

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

      【讨论】:

      • 我担心服务器端处理会占用大量资源,所以我不想在知道文件编号 1 如果完全处理(不仅接收)之前发送文件编号 1服务器。但是,您的答案与 mattlant 的答案基本相同,所以猜想这就是我必须走的路。
      【解决方案4】:

      或者您也可以使用 JavaScript (jQuery) 来实现...如果您不介意使用 JavaScript。

      【讨论】:

        【解决方案5】:

        如果文件不是很大,并且可以将每个文件保存在内存中,一个丑陋但有效的解决方案是将它们转换为字符串并使用 UploadStringAsync 方法发送它们。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-25
          • 1970-01-01
          • 2014-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-03
          相关资源
          最近更新 更多