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