.net Framework 4.8 < /li>
Я использую веб -формы asp.net < /li>
В одном и том же проекте, у меня есть Ajax WCF Web Service < /li>
, что Ap Service AP. project
The WCF backend calls SQL Server using ADO.NET
Sometimes these APIs feel slow, but the issue goes away by itself after a while
Logs are pushed to Kibana/Elastic via Serilog
The issue
периодически, IIS входит в журнал для < /p>
POST /eMobilityPortal/AjaxWebService.svc/GetPartners
show multi-second time-taken (e.g., ~4–10s).
For the same request (correlated with CID):
Ajax caller logs are sub-second (usually Что я сделал < /strong> < /p>
Время WCF Client (Ajax Layer) - Serialize /Wire /Deserialize < /li>
< /ul>
public sealed class CallTiming
{
public string Cid = Guid.NewGuid().ToString("N");
public Stopwatch T = new();
public long ReqSerializeMs, WireMs, RespDeserializeMs;
}
public static class TimingStore
{
public static readonly AsyncLocal Current = new();
public static readonly AsyncLocal Last = new();
}
public sealed class TimedClientInspector : IClientMessageInspector
{
private readonly Stopwatch _wire = new();
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var t = TimingStore.Current.Value;
if (t != null && t.T.IsRunning)
t.ReqSerializeMs = t.T.ElapsedMilliseconds;
_wire.Restart(); return null;
}
public void AfterReceiveReply(ref Message reply, object state)
{
_wire.Stop();
var t = TimingStore.Current.Value;
if (t != null)
t.WireMs = _wire.ElapsedMilliseconds;
}
}
< /code>
Обертка и журнал Caller: < /p>
[OperationContract]
public AdminService.OfficePartner[] GetPartners()
{
var stopwatch = Stopwatch.StartNew();
var startTime = DateTime.UtcNow;
Log.Information("GetPartners request started at {StartTime}", startTime);
var total = Stopwatch.StartNew();
var svc = new eMobilityService();
Log.Information("Ajax.GetPartners ENTRY");
var result = svc.GetPartners();
stopwatch.Stop();
total.Stop();
var endTime = DateTime.UtcNow;
var duration = endTime - startTime;
var last = TimingStore.Last.Value;
long req = last?.ReqSerializeMs ?? 0;
long wire = last?.WireMs ?? 0;
long resp = last?.RespDeserializeMs ?? 0;
long local = Math.Max(0, total.ElapsedMilliseconds - (req + wire + resp));
var cid = last?.Cid ?? Guid.NewGuid().ToString("N");
public OfficePartner[] GetPartners()
{
return Call(s_adminFactory,
svc => svc.GetPartners("abc", "abc"));
}
< /code>
Результат: Client totals = сотни MS, даже если IIS показывает многосекунды.public List GetPartners(string abc, string abc)
{
var start = DateTime.Now;
var resp = BLOfficeManagement.GetPartners(); // ADO.NET calls
var ms = (DateTime.Now - start).TotalMilliseconds;
BLOfficeManagement.LogMessage(4, (long)ms, $"GetPartners total {ms} ms");
return resp;
}
[/code]
web.config (отрезан для соответствующих частей)
< /code>
Результат: обычно субсекунда. SQL Query Store подтверждает, что база данных быстро.>
[b] flow /Tech Stack < /strong> < /p> [list] [*].net Framework 4.8 < /li> Я использую веб -формы asp.net < /li> В одном и том же проекте, у меня есть Ajax WCF Web Service < /li> , что Ap Service AP. project [*]The WCF backend calls SQL Server using ADO.NET [*]Sometimes these APIs feel slow, but the issue goes away by itself after a while [*]Logs are pushed to Kibana/Elastic via Serilog [/list] The issue[/b] периодически, IIS входит в журнал для < /p> [code]POST /eMobilityPortal/AjaxWebService.svc/GetPartners [/code] show multi-second time-taken (e.g., ~4–10s). For the same request (correlated with CID): [list] [*]Ajax caller logs are sub-second (usually [b] Что я сделал < /strong> < /p>
Время WCF Client (Ajax Layer) - Serialize /Wire /Deserialize < /li> < /ul> public sealed class CallTiming { public string Cid = Guid.NewGuid().ToString("N"); public Stopwatch T = new(); public long ReqSerializeMs, WireMs, RespDeserializeMs; }
public static class TimingStore { public static readonly AsyncLocal Current = new(); public static readonly AsyncLocal Last = new(); }
public sealed class TimedClientInspector : IClientMessageInspector { private readonly Stopwatch _wire = new();
public object BeforeSendRequest(ref Message request, IClientChannel channel) { var t = TimingStore.Current.Value;
if (t != null && t.T.IsRunning) t.ReqSerializeMs = t.T.ElapsedMilliseconds;
_wire.Restart(); return null; }
public void AfterReceiveReply(ref Message reply, object state) { _wire.Stop(); var t = TimingStore.Current.Value;
if (t != null) t.WireMs = _wire.ElapsedMilliseconds; } } < /code> Обертка и журнал Caller: < /p> [OperationContract] public AdminService.OfficePartner[] GetPartners() { var stopwatch = Stopwatch.StartNew(); var startTime = DateTime.UtcNow; Log.Information("GetPartners request started at {StartTime}", startTime);
var total = Stopwatch.StartNew();
var svc = new eMobilityService(); Log.Information("Ajax.GetPartners ENTRY"); var result = svc.GetPartners();
stopwatch.Stop(); total.Stop(); var endTime = DateTime.UtcNow; var duration = endTime - startTime;
var last = TimingStore.Last.Value; long req = last?.ReqSerializeMs ?? 0; long wire = last?.WireMs ?? 0; long resp = last?.RespDeserializeMs ?? 0; long local = Math.Max(0, total.ElapsedMilliseconds - (req + wire + resp)); var cid = last?.Cid ?? Guid.NewGuid().ToString("N");
public OfficePartner[] GetPartners() { return Call(s_adminFactory, svc => svc.GetPartners("abc", "abc")); } < /code> Результат: Client totals = сотни MS, даже если IIS показывает многосекунды.public List GetPartners(string abc, string abc) { var start = DateTime.Now; var resp = BLOfficeManagement.GetPartners(); // ADO.NET calls var ms = (DateTime.Now - start).TotalMilliseconds; BLOfficeManagement.LogMessage(4, (long)ms, $"GetPartners total {ms} ms"); return resp; } [/code] web.config (отрезан для соответствующих частей) [/b]
< /code> Результат: обычно субсекунда. SQL Query Store подтверждает, что база данных быстро.>