小智 4
大文件传输确实是 wcf 中的一个问题,并且流选项不能解决任何问题(您甚至需要服务器上更多的内存)。
如果您不想使用套接字,可以通过实现自己的“协议”来解决问题,该“协议”用于将文件分成块并仅传输单独的块。我使用了reliableSessions和TransportWithMessageCredential。
服务器(或客户端)界面如下所示:
[ServiceContract(CallbackContract = typeof(IClient), SessionMode = SessionMode.Required)]
public interface IServer
{
[OperationContract]
FilePart GetFileChunk(string identifier, int number, int blockSize);
}
Run Code Online (Sandbox Code Playgroud)
作为 DataContract 你可以使用这样的东西:
[DataContract]
public class FilePart
{
[DataMember] public int Part;
[DataMember] public byte[] Data;
[DataMember] public int BlockSize;
}
Run Code Online (Sandbox Code Playgroud)
要找到“正确”的块大小,您必须稍微尝试一下,我建议大约 64-512 kb。当它们太小时,您会有很多请求,当它们太大时,速度会变慢,并且服务器端的负载会增加。
同样重要的是 maxReceivedMessageSize、maxBufferSize 和超时足够高(在绑定配置中)和读取器配额。为了进行测试,我建议使用所有字段的最大值,当它起作用时,使用更适合的值。
如果您使用双工绑定,则可以通过引用传递对象。通过这种方式你可以传递回调对象,这样你就可以更好地查看传输的进度等等......
[OperationContract IsOneWay=true]
FilePart GetFileChunk(string identifier, int number, int blockSize, ref TransferState callback);
Run Code Online (Sandbox Code Playgroud)
我想这就是我能给出的所有技巧和提示。我希望它有帮助。
| 归档时间: |
|
| 查看次数: |
956 次 |
| 最近记录: |