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};
}
내가 다른 바인딩 속성을 추가해야합니까? 희망없는 당신이 나를 도와 줄 수 있기를 바랍니다 :)
모든 WCF 서비스의 첫 번째 호출은 기타로 인해 느립니다. 양쪽에서 초기화. 후속 통화가 느려 집니까? – Larry
예, 첫 번째 호출은 서버 측 (~ 10 초)에서 느리고 후속 호출 (~ 7ms)에서는 매우 빠릅니다. 클라이언트 측의 호출은 항상 ~ 2 초 정도 느립니다. – Newbie
그러면 그리드가 속도 저하의 원인이 될 것으로 판단됩니다. 3000 가지 항목이 많이 있습니다. 가상 모드에서 사용하는 것이 좋습니다. – Larry