WCF NamedPipes在客户端确实很慢

时间:2015-01-22 10:05:34

标签: performance wcf

我是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};
        }

我是否必须添加其他绑定属性?希望你能帮助我,因为我无能为力:))

1 个答案:

答案 0 :(得分:2)

感谢Larry,客户呼叫现在只需要70ms。延迟是TransferMode.Streaming属性。我改变了

bindung.TransferMode = TransferMode.Streamed;

bindung.TransferMode = TransferMode.Buffered;

现在一切都很完美:) 非常感谢,拉里! (为什么第一次改变不起作用仍然是个谜,但我不抱怨)