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

我有一个自定义的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上做任何回调吗?我应该使用其他种类的转移技术吗?请指教!

有帮助吗?

解决方案

Hrm,也许一个简单的解决方案可能是用GUID标记网址(每个文件的guid是唯一的,或者转移,无论你的情况有什么意义)。然后你可以有另一个简单的web服务,它能够根据guid检查其他服务的状态,并让你的silverlight客户端查询新服务的处理状态(通过传递新的web服务的guid)过去转移)。

其他提示

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

我假设您担心从处理程序返回的数据需要很长时间才能传输,并且在此期间服务器未被使用。没有办法告诉服务器何时完成处理,所以我认为如果不改变你的体系结构就不能这样做。

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

或者你可以用JavaScript(jQuery)来做...如果你不介意使用JavaScript。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top