webservice上传和进度

时间:2009-12-30 18:43:49

标签: winforms web-services multithreading

请帮助我这个,我不确定正确或最好的方法是什么。基本上我有一个web服务,它接受一个字节流,使c#winform应用程序能够将文件上传到webservice。

我需要的是winform一次在后台上传一个文件(使用基本多线程,它会尝试一次上传所有文件)。我还需要在那里放一个进度条。

我该怎么办?有任何想法吗?我觉得它应该是相当直接的。我认为应用程序应该为第一个文件启动一个新线程,等到它完成然后处理该线程,为下一个文件创建一个新线程,依此类推。

2 个答案:

答案 0 :(得分:0)

这完全取决于您在客户端使用的技术来访问Web服务。

如果该技术允许自定义客户端代理到可以拦截消息传输的点(WCF允许这样,我不记得旧的Web服务引用做了多少),那么你应该能够添加你的钩子,看看何时处理/发送字节。


根据bookstorecowboy关于在.NET中使用旧的“Web引用”功能的评论,我相信它生成了源自SoapHttpClientProtocol类的代理。

在这种情况下,我建议创建一个派生自SoapHttpClientProtocol类的自定义类,覆盖GetWriterForMessage method。在这里,你应该返回一个XmlWriter,给定Stream作为SoapClientMessage参数的属性传递。

您还将创建一个派生自Stream的自定义类,它接受Stream实例并将所有调用转发给该实例。

唯一的区别是,在Write方法中,您将触发一个事件,指示写入了多少字节。

然后,您将获得传递给GetWriterForMessage的SoapClientMessage上公开的Stream,并将其包装在您的自定义Stream实现中。您也可以在此处连接您的事件处理程序。

使用该流,您将创建XmlWriter并将其返回。

然后,对于您的代理,您将使用从SoapHttpClientProtocol派生的新类,并从中派生出代理。

答案 1 :(得分:0)

对于ASP.NET 2.0 Web服务(“旧Web服务”),您可以添加Web服务扩展以更改和扩展其行为。 您还可以添加自定义Http模块。 它允许您访问流级别。

请参阅Soap ExtensionsHttp Modules

相关问题