通过WCF进行文件传输

通过WCF进行文件传输,wcf,file-transfer,Wcf,File Transfer,我是WCF的新手,所以若你们能尽可能详细地回答我的问题,我将不胜感激:)我有一个WCF服务库和一个WPF应用程序(谁是客户)。想要的结果是一个能够在连接的客户端之间实现文件共享的应用程序。我使用一种方法构建了一个真正的基本WCF服务库: [ServiceContract] public interface IFileService { [OperationContract] byte[] GetFile(string fullPath); } 并实现了如下方法: public

我是WCF的新手,所以若你们能尽可能详细地回答我的问题,我将不胜感激:)我有一个WCF服务库和一个WPF应用程序(谁是客户)。想要的结果是一个能够在连接的客户端之间实现文件共享的应用程序。我使用一种方法构建了一个真正的基本WCF服务库:

[ServiceContract]
public interface IFileService
{
    [OperationContract]
    byte[] GetFile(string fullPath);
}
并实现了如下方法:

public class FileService : IFileService
{
    public byte[] GetFile(string fullPath)
    {
        return System.IO.File.ReadAllBytes(fullPath);
    }
}
这是WPF客户端项目中的App.config文件:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IFileService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Message">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:9355/TankusFileTransferService/Service/"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFileService"
            contract="TankusFileService.IFileService" name="WSHttpBinding_IFileService">
            <identity>
                <userPrincipalName value="GIL-LAPTOP\Gil" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

在我按下connect按钮并初始化ServiceHost对象以便它可以开始侦听之后,我按下getFile按钮。调用GetFile()函数时,它抛出一个TimeoutException。为什么会这样?我是否在完成我想要的申请的正确道路上?谢谢:)

您可能会收到TimeoutException,因为发送文件的时间比您的服务允许的时间长

在服务器和客户端的配置文件中,确保增加receiveTimeoutsendetimeout

当WCF配置最大消息大小时,您也可能会遇到大小限制,并且该文件将被视为消息的一部分。查看maxBufferPoolSizemaxReceivedMessageSize,以及下面的成员

<readerQuotas 
     maxDepth="32" maxStringContentLength="8192" 
     maxArrayLength="16384" maxBytesPerRead="4096" 
     maxNameTableCharCount="16384" />

同步web服务请求不是传输文件的最佳方式。即使有效,如果需要扩展端点以处理并发请求,也会很快遇到麻烦。通过将文件上载到服务端点,您正在损害端点的可用性

更好的解决方案是,WPF应用程序将filestream写入磁盘(或数据库、ftp服务器或队列),然后向服务器发送一条快速单向命令消息,然后服务器继续并获取该文件

这将大大提高可扩展性,并将导致更少的可用性类型异常

更新

根据我的经验,当您将大型文件上载到web服务端点时,您可能会遇到可用性问题,特别是在存在显著并发的情况下。如果您知道自己的上限(文件大小、并发连接等),您可以对此进行规划,并且可以将其形式化为服务级别协议,但根据定义,您尝试做的事情(点对点)的本质是一个不稳定的环境,这样的规划将很困难

然而,也就是说,您的需求是P2P,这意味着理想情况下不应该有一个集中的环境来实现我建议的存储和检索消息模式


Windows Azure blob存储就是实现这一目标的一个例子

发布频道的web.config设置。你可能需要加大尺寸。我不太明白你的答案。最后,我希望有一个文件共享系统,客户端可以看到不同客户端指定目录中的所有文件,并可以将所选文件从其他用户的计算机传输到第一台客户端计算机。因此,如果我想将2Gb文件从您的计算机传输到我的计算机,该怎么办?你的服务应该支持吗?嗯,这是课程的最后一个项目,所以我想2GB的文件不会被传输。我想更多地了解这项技术,更好地理解您建议的解决方案。
<readerQuotas 
     maxDepth="32" maxStringContentLength="8192" 
     maxArrayLength="16384" maxBytesPerRead="4096" 
     maxNameTableCharCount="16384" />