2008-09-30 100 views
1

可能是一个简单的解决方案的长问题,但这里有...如何在客户端知道HTTP处理程序何时完成处理?

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

回答

0

Hrm,也许一个简单的解决方案可能是用GUID来标记url(每个文件的guid都是唯一的,或者转移,对你的状态有意义的任何东西)。然后,您可以拥有另一个简单的Web服务,该服务能够基于guid检查其他服务的状态,并让您的Silverlight客户端为其处理状态查询该新服务(通过将新Web服务传递给过去的转移)。

+0

像这样的东西可能会工作 - 但我希望有另一种方式,内置的东西,不涉及像这样的单独的服务。 – 2008-09-30 11:28:05

0

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

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

+0

我担心服务器端处理会占用大量资源,因此如果服务器完全处理(不仅仅是接收到)文件编号1,我不想发送第二个文件。然而,你的答案与mattlant的基本相同,所以猜测这就是我必须去的方式。 – 2008-09-30 11:34:50

0

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

0

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

如果文件大小是无界限的,请避免使用这种方法,但如果现在可以确定文件大小相对较小,则可以使用此方法。

1

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

相关问题