我是WCF的新手并注意到NamedPipes服务的奇怪行为。 该服务为每个服务调用添加一个自定义标头,其中包含服务调用的持续时间(服务器端)。客户还测量服务呼叫的时间。
我的测试服务从数据库加载大约3000个简单对象。客户端在WPF网格中显示这些对象。虽然服务端非常快(大约7毫秒),但客户端的服务调用大约需要2秒。谷歌告诉我,我应该禁用安全性,但这也没有帮助。
你能解释为什么客户电话会这么慢吗?
这是服务功能(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;
}
返回商店之前的最后两行都会测量以后显示操作的时间(抱歉,德语;))。 最后但并非最不重要的是绑定配置(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};
}
我是否必须添加其他绑定属性?希望你能帮助我,因为我无能为力:))
答案 0 :(得分:2)
感谢Larry,客户呼叫现在只需要70ms。延迟是TransferMode.Streaming属性。我改变了
bindung.TransferMode = TransferMode.Streamed;
到
bindung.TransferMode = TransferMode.Buffered;
现在一切都很完美:) 非常感谢,拉里! (为什么第一次改变不起作用仍然是个谜,但我不抱怨)