【问题标题】:webservice upload and progresswebservice上传和进度
【发布时间】:2009-12-30 18:43:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: winforms web-services multithreading


    【解决方案1】:

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

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


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

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

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

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

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

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

    然后,对于您的代理,您将使用这个派生自 SoapHttpClientProtocol 的新类,并让代理派生自该类。

    【讨论】:

    • 感谢 Casper,好的,所以它使用老式的 .NET 代理版本,并使用 WINFORM 从 C# 中调用 Web 服务。它创建 Web 服务的一个版本,然后通过文件发送。有些文件的长度是 20mb 左右。
    • 此外,它还会发送未知数量的文件,因为它基本上是在备份用户创建的目录,所以它首先扫描目录,然后依次ping每个文件。
    【解决方案2】:

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

    Soap Extensions,Http Modules

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多