【问题标题】:WCF Upload fileWCF 上传文件
【发布时间】:2012-01-16 04:07:25
【问题描述】:

我以前从未使用过 WCF,但我想创建一个简单的服务。我希望计算机从本地计算机上传文件。我的界面中有这个:

[OperationContract]
[WebInvoke(Method = "GET",UriTemplate = "/File")]
Stream GetFile();

在方法中,我只是这样做:

return new FileStream(@"c:\myfile.zip", FileMode.Open);

当我从客户端运行它时,Result 属性包含流本身。这很好,它可以工作,但我宁愿客户端从服务器本身访问文件,而不是复制整个文件。上传文件的 URL 是什么,以便客户端可以直接从服务器访问它?我以为是http://computername:port/something...(我相信这是一个 REST 服务?)

【问题讨论】:

  • 如果客户端应该对文件内容做一些事情,那么无论如何它都需要复制它,无论你如何共享它(流,共享文件夹,http,ftp,...),不不是吗?
  • 但是如果客户端不使用 WCF 服务怎么办?我假设他们仍然可以直接访问该文件?此外,上述方法不允许流式传输,因为它会先下载整个文件(例如音乐、视频等)
  • 为了使用 WCF 流式传输文件,您可以将 transferMode 属性设置为“流式传输”,这将连续传输您的文件,而不是等待整个响应可用的缓冲模式。

标签: c# wcf rest upload stream


【解决方案1】:

让我们试着想想你在说什么。

  • 用户可以直接访问文件。在这种情况下,可以公平地认为,任何用户都可以访问任何计算机上的任何文件。很明显,事实并非如此。

  • WCF 提供了一些特殊的接口来访问运行它的计算机上的文件。这也是一个很大的安全漏洞。

  • 还有其他想法吗?

无论如何,如果您想在网络上共享文件,您应该为其创建一个公共接口。 这可能是一个 IIS 服务器,它将从服务器计算机返回它,或者这可能只是您的 WCF 服务器。

不管怎样,你做的是对的。 Stream 通过网络返回一个文件,它不会像您想象的那样复制(复制)某些信息。

更新: 要启用流媒体,您可以查看此article

更新 2: 如果您确实需要流式传输视频文件,Smooth Streaming 可能是一个选项

【讨论】:

    【解决方案2】:

    我认为你在这里把事情搞混了。您使用返回 Stream 的操作公开 WCF 服务。这是一个文件流是一个实现细节。您也可以返回一个内存流或一个网络流或任何源自Stream 的东西。如果您想让客户端直接访问文件,您需要共享它以便它可以访问它。在 Windows 上,您可以创建一个共享文件夹(但您真的不想在 Internet 上公开它)或者您设置一个 ftp 或 http 服务器。

    我没有修改 WCF 和流式传输,但我希望当您从服务器提供流时,它或多或少地开箱即用(意味着它流式传输文件而不是下载一大块) .看看这个MSDN article,它详细介绍了使用 WCF 进行流式传输的一些限制。

    【讨论】:

    • 我尝试通过直接从我的客户端调用 GetFile 来流式传输视频文件。客户端使用 WCF 服务,因此它可以调用该方法。调用此方法导致必须等到整个文件下载完毕。文件完全下载完成后,我可以从下载完成事件的e.Result 属性中访问它。在那之前,我知道没有办法访问它。我宁愿流式传输文件,而不是在播放前下载整个文件。 WCF 可以做到这一点吗?
    • @Skoder:我添加了指向 MSDN 的链接,其中包含有关通过 WCF 进行流式传输的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多