有没有办法在netTcpBinding中启用会话和流媒体?

DxC*_*xCK 5 .net c# streaming session wcf

我写了一个需要传输大文件的WCF服务,所以我使用流媒体,但另一方面我需要进行用户名特定的初始化.

问题是每次获取用户名并执行初始化非常昂贵.如果我可以打开会话,我可以将初始化数据保存在服务实例中的本地变量中.

有没有办法在netTcpBinding中启用流媒体和会话?

小智 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)

我想这就是我能给出的所有技巧和提示。我希望它有帮助。