2011-12-08 82 views
0

我从来没有使用过WCF,但我想创建一个简单的服务。我想让电脑从本地机器上传文件。我在我的界面得到这个:WCF上传文件

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

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

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

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

+1

无论如何分享它(流,共享文件夹,http,ftp,...),它都需要复制文件内容,不是吗? – ChrisWue

+0

但是如果客户端不使用WCF服务呢?我假设他们仍然可以直接访问文件?此外,上述方法不允许流式传输,因为它会先下载整个文件(例如音乐,视频等)。 – Skoder

+0

为了使用WCF流式传输文件,您可以将transferMode属性设置为“流式传输”,这将使您的流文件连续而不是等待整个响应可用的缓冲模式。 – Rajesh

回答

0

让我们试着思考你在说什么。

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

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

  • 还有其他想法吗?

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

无论如何,你做的是对的。 Stream通过网络返回一个文件,它没有拷贝(复制)一些信息的开销,就像你想的那样。

UPDATE: 要启用流,你可以看看这个article

更新2: 如果你真的需要流式播放视频文件时,如果客户是Smooth Streaming可能是一个选项

0

我认为你在这里得到的东西有点混淆。您使用返回Stream的操作公开WCF服务。这是一个文件流是一个实现细节。您也可以返回一个内存流或网络流,或者真的返回从Stream派生的任何内容。如果您希望让客户直接访问该文件,则需要共享该文件以便访问该文件。在Windows上,你可以创建一个共享文件夹(但你真的不想在互联网上公开)或者你设置了一个ftp或http服务器。

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

+0

我试图通过直接从我的客户端调用'GetFile'来流式传输视频文件。客户端使用WCF服务,因此它可以调用该方法。调用这个方法导致不得不等待整个文件被下载。一旦文件完全下载完成,我就可以从下载完成事件的'e.Result'属性中访问它。在那之前,我知道无法访问它。我宁愿传输文件,不要在播放之前下载整个文件。这可能与WCF? – Skoder

+0

@Skoder:我添加了MSDN链接,其中包含有关通过WCF流​​式传输的信息 – ChrisWue