1

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

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

4

5 回答 5

1

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

于 2011-11-30T10:51:47.387 回答
0

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

于 2008-09-30T11:24:48.210 回答
0

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

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

于 2008-09-30T11:31:09.893 回答
0

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

于 2008-09-30T13:15:42.857 回答
0

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

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

于 2008-09-30T17:46:33.813 回答