WCF NamedPipes 在客户端真的很慢
WCF NamedPipes really slow on client side
我是 WCF 新手,注意到 NamedPipes 服务有一个奇怪的行为。
该服务为每个服务调用添加一个自定义 header 以及服务调用的持续时间(服务器端)。客户端还测量服务调用的时间。
我的测试服务从数据库加载大约 3000 个简单的 objects。客户端在 WPF 网格中显示那些 objects。虽然服务端非常快(大约 7 毫秒),但客户端的服务调用大约需要 2 秒。 Google 告诉我应该禁用安全功能,但这也无济于事。
你能解释一下为什么客户端调用这么慢吗?
这里是服务函数(VB):
Public Function HoleAlleAdressenMitEF() As List(Of Adresse) Implements IDatenbankService.HoleAlleAdressenMitEF
Dim ergebnis As New List(Of Adresse)
Dim sw As New Stopwatch
sw.Start()
ergebnis = DatenVerzeichnisEF.Instance.HoleAlleAdressen 'loads objects from db
sw.Stop()
Dim h As Channels.MessageHeader = Channels.MessageHeader.CreateHeader("Dauer", "ns", sw.Elapsed.ToString)
OperationContext.Current.OutgoingMessageHeaders.Add(h)
Return ergebnis
End Function
这是我的客户端 (C#) 中的服务调用:
public Adresse[] HoleAlleAdressenMitEF()
{
string duration = "0";
var stopwatch = Stopwatch.StartNew();
Adresse[] ergebnis;
using (var scope = new OperationContextScope((IClientChannel)_adressServiceKanal))
{
ergebnis = _adressServiceKanal.HoleAlleAdressenMitEF(); //service call
stopwatch.Stop();
var headers = OperationContext.Current.IncomingMessageHeaders;
var header = headers.FindHeader("Dauer", "ns");
duration = headers.GetHeader<string>(header);
}
LetzteAusfuehrDauerGesamt = stopwatch.Elapsed;
LetzteAusfuehrDauerServerseitig = TimeSpan.Parse(duration);
return ergebnis;
}
return 之前的最后 2 行存储两个测量时间以供以后显示操作(抱歉,德语 ;))。
最后但同样重要的是绑定配置 (C#):
private static void KonfiguriereBindung(NetNamedPipeBinding bindung)
{
bindung.TransferMode = TransferMode.Streamed;
bindung.MaxBufferPoolSize = 2147483647;
bindung.MaxBufferSize = 2147483647;
bindung.MaxReceivedMessageSize = 2147483647;
bindung.ReaderQuotas.MaxArrayLength = 2147483647;
bindung.ReaderQuotas.MaxBytesPerRead = 2147483647;
bindung.ReaderQuotas.MaxStringContentLength = 2147483647;
bindung.ReaderQuotas.MaxDepth = 2147483647;
bindung.OpenTimeout = TimeSpan.FromMinutes(10);
bindung.SendTimeout = TimeSpan.FromMinutes(10);
bindung.ReceiveTimeout = TimeSpan.FromMinutes(10);
bindung.CloseTimeout = TimeSpan.FromDays(1);
bindung.Security.Mode = NetNamedPipeSecurityMode.None;
bindung.Security.Transport = new NamedPipeTransportSecurity() { ProtectionLevel= System.Net.Security.ProtectionLevel.None};
}
我是否必须添加其他绑定属性?希望你能帮助我,因为我一无所知:)
感谢 Larry,客户端调用现在只需要 70 毫秒。延迟是 TransferMode.Streaming 属性。我变了
bindung.TransferMode = TransferMode.Streamed;
到
bindung.TransferMode = TransferMode.Buffered;
现在一切正常:)
非常感谢,拉里! (为什么这个改变第一次没有奏效仍然是个谜,但我不是在抱怨)
我是 WCF 新手,注意到 NamedPipes 服务有一个奇怪的行为。 该服务为每个服务调用添加一个自定义 header 以及服务调用的持续时间(服务器端)。客户端还测量服务调用的时间。
我的测试服务从数据库加载大约 3000 个简单的 objects。客户端在 WPF 网格中显示那些 objects。虽然服务端非常快(大约 7 毫秒),但客户端的服务调用大约需要 2 秒。 Google 告诉我应该禁用安全功能,但这也无济于事。
你能解释一下为什么客户端调用这么慢吗?
这里是服务函数(VB):
Public Function HoleAlleAdressenMitEF() As List(Of Adresse) Implements IDatenbankService.HoleAlleAdressenMitEF
Dim ergebnis As New List(Of Adresse)
Dim sw As New Stopwatch
sw.Start()
ergebnis = DatenVerzeichnisEF.Instance.HoleAlleAdressen 'loads objects from db
sw.Stop()
Dim h As Channels.MessageHeader = Channels.MessageHeader.CreateHeader("Dauer", "ns", sw.Elapsed.ToString)
OperationContext.Current.OutgoingMessageHeaders.Add(h)
Return ergebnis
End Function
这是我的客户端 (C#) 中的服务调用:
public Adresse[] HoleAlleAdressenMitEF()
{
string duration = "0";
var stopwatch = Stopwatch.StartNew();
Adresse[] ergebnis;
using (var scope = new OperationContextScope((IClientChannel)_adressServiceKanal))
{
ergebnis = _adressServiceKanal.HoleAlleAdressenMitEF(); //service call
stopwatch.Stop();
var headers = OperationContext.Current.IncomingMessageHeaders;
var header = headers.FindHeader("Dauer", "ns");
duration = headers.GetHeader<string>(header);
}
LetzteAusfuehrDauerGesamt = stopwatch.Elapsed;
LetzteAusfuehrDauerServerseitig = TimeSpan.Parse(duration);
return ergebnis;
}
return 之前的最后 2 行存储两个测量时间以供以后显示操作(抱歉,德语 ;))。 最后但同样重要的是绑定配置 (C#):
private static void KonfiguriereBindung(NetNamedPipeBinding bindung)
{
bindung.TransferMode = TransferMode.Streamed;
bindung.MaxBufferPoolSize = 2147483647;
bindung.MaxBufferSize = 2147483647;
bindung.MaxReceivedMessageSize = 2147483647;
bindung.ReaderQuotas.MaxArrayLength = 2147483647;
bindung.ReaderQuotas.MaxBytesPerRead = 2147483647;
bindung.ReaderQuotas.MaxStringContentLength = 2147483647;
bindung.ReaderQuotas.MaxDepth = 2147483647;
bindung.OpenTimeout = TimeSpan.FromMinutes(10);
bindung.SendTimeout = TimeSpan.FromMinutes(10);
bindung.ReceiveTimeout = TimeSpan.FromMinutes(10);
bindung.CloseTimeout = TimeSpan.FromDays(1);
bindung.Security.Mode = NetNamedPipeSecurityMode.None;
bindung.Security.Transport = new NamedPipeTransportSecurity() { ProtectionLevel= System.Net.Security.ProtectionLevel.None};
}
我是否必须添加其他绑定属性?希望你能帮助我,因为我一无所知:)
感谢 Larry,客户端调用现在只需要 70 毫秒。延迟是 TransferMode.Streaming 属性。我变了
bindung.TransferMode = TransferMode.Streamed;
到
bindung.TransferMode = TransferMode.Buffered;
现在一切正常:) 非常感谢,拉里! (为什么这个改变第一次没有奏效仍然是个谜,但我不是在抱怨)