我以前从未使用过WCF,但我想创建一个简单的服务。我想让电脑从本地机器上传一个文件。我已经在我的界面中设置了这个:
[OperationContract]
[WebInvoke(Method = "GET",UriTemplate = "/File")]
Stream GetFile();
在方法中,我只需要这样做:
return new FileStream(@"c:myfile.zip", FileMode.Open);
当我从客户端运行这个时,Result
属性包含流本身。这很好,它可以工作,但我宁愿客户端从服务器本身访问文件,而不是复制整个东西。上传文件的URL是什么,以便客户机可以直接从服务器访问它?我假设它是http://computername:port/something...
(我相信这是一个REST服务?)
让我们仔细考虑一下你在说什么。
-
用户可以直接访问文件。在这种情况下,可以公平地认为,任何用户都可以访问任何计算机上的任何文件。很明显,事实并非如此。
-
WCF提供了一些特殊的接口来访问正在运行的计算机上的文件。这也是一个很大的安全漏洞。
-
还有其他想法吗?
在任何情况下,如果你想在网络上共享文件,你应该为它创建一个公共接口。这可能是一个IIS服务器,它将从服务器机器返回它,或者这可能只是您的WCF服务器。
不管怎样,你做的是对的。Stream
通过网络返回一个文件,它没有复制(复制)一些信息的开销,就像你可能认为的那样。
更新:要启用流媒体,可以查看这篇文章
更新2:如果你真的需要流视频文件,平滑流可以是一个选项
我想你把事情弄混了。使用返回Stream
的操作公开WCF服务。这是一个文件流是一个实现细节。你也可以返回一个内存流或者一个网络流或者任何来自Stream
的东西。如果您想让客户端直接访问文件,您需要共享它,以便它可以访问它。在Windows上,你可以创建一个共享文件夹(但你真的不想在互联网上暴露它),或者你设置一个ftp或http服务器。
我没有修改过WCF和流,但我希望当你从服务器提供一个流时,它或多或少是开箱即用的(意思是它流式传输文件,而不是在一个大块中下载)。请查看这篇MSDN文章,其中详细介绍了使用WCF进行流传输的一些限制。