2015-01-22 2 views
1

WCF를 처음 사용하고 NamedPipes 서비스에서 이상한 동작을 발견했습니다. 서비스는 모든 서비스 호출에 대해 서비스 호출 기간 (서버 측)이있는 사용자 정의 헤더를 추가합니다. 또한 클라이언트는 서비스 호출 시간을 측정합니다.WCF NamedPipes가 클라이언트 쪽에서 실제로 느림

내 테스트 서비스는 데이터베이스에서 약 3000 개의 간단한 개체를로드합니다. 클라이언트는 이러한 개체를 WPF Grid에 표시합니다. 서비스 측면이 매우 빠르지 만 (약 7ms) 클라이언트의 서비스 호출에는 약 2 초가 걸립니다. Google은 보안을 해제해야한다고 말했지만 그 역시 도움이되지 못했습니다.

왜 클라이언트 호출이 너무 느린 지 설명 할 수 있습니까? 모두 측정 시간 반환 저장하기 전에

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

마지막 2 줄 :

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#을)이 있습니다 : 여기

서비스 기능 (VB)입니다 나중에 표시 작업 (미안, 독일어;)). 마지막으로 그리고 바인딩 구성 (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

모든 WCF 서비스의 첫 번째 호출은 기타로 인해 느립니다. 양쪽에서 초기화. 후속 통화가 느려 집니까? – Larry

+0

예, 첫 번째 호출은 서버 측 (~ 10 초)에서 느리고 후속 호출 (~ 7ms)에서는 매우 빠릅니다. 클라이언트 측의 호출은 항상 ~ 2 초 정도 느립니다. – Newbie

+0

그러면 그리드가 속도 저하의 원인이 될 것으로 판단됩니다. 3000 가지 항목이 많이 있습니다. 가상 모드에서 사용하는 것이 좋습니다. – Larry

답변

2

래리 덕분에 이제는 클라이언트 호출이 70ms 만 필요합니다. 지연은 TransferMode.Streaming 속성입니다. 나는

bindung.TransferMode = TransferMode.Buffered; 

bindung.TransferMode = TransferMode.Streamed; 

변경 이제 모든 고마워, 래리 : 완벽한 작품! (왜 그 변화가 처음에는 여전히 수수께끼인지는 모르지만 불평하지는 않습니다)

+0

당신을 환영한다. 기쁘다. ^^ – Larry

관련 문제