IIS Time Taken показывает многосекундную задержку, в то время как Webforms ASP.NET → WCF → SQL Timings являются подсекунC#

Место общения программистов C#
Ответить
Anonymous
 IIS Time Taken показывает многосекундную задержку, в то время как Webforms ASP.NET → WCF → SQL Timings являются подсекун

Сообщение Anonymous »

flow /Tech Stack < /strong> < /p>
  • .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");

    Log.Information("CID={Cid} Ajax.GetPartners req_ser={Req}ms wire={Wire}ms resp_deser={Resp}ms local={Local}ms total={Total}ms. StartTime = {StartTime} EndTime = {EndTime} Duration: {Duration} ms TotalTime = {TotalTime}",
    cid, req, wire, resp, local, total.ElapsedMilliseconds, startTime, endTime, stopwatch.ElapsedMilliseconds, (long)duration.TotalMilliseconds);

    return result;
    }

    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 подтверждает, что база данных быстро.>

    Подробнее здесь: https://stackoverflow.com/questions/797 ... 92-sql-tim
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»