Почему try-catch-finally в Task.Run не работает должным образом - PullRequest
0 голосов
/ 06 мая 2019

Служба ASPNetMVC, размещенная на IIS в производственной среде, иногда имеет странные исключения.

В асинхронном режиме пишется try-catch-finally, и в блоке try есть сетевой запрос. При нормальных обстоятельствах, когда исключение происходит в сетевом запросе, перехват поймает исключение Однако на производственном сервере иногда возникает исключение, которое не перехватывается, и логика в обоих случаях перехватывает и, наконец, не выполняется.

окружающая среда:

  • Windows service 2008 R2
  • IIS8
  • .Net Framework 4.5.2
public static string post(string url, string method, object postdata, bool iscache = false)
{
    var uuid = Guid.NewGuid().ToString().ToUpper().Split('-').ToList().Last() + " ";
    TraceLog.m_Trace.Trace(uuid + method + " url=" + url); // write log 1
    var rs = "";
    var key = "";
    try
    {
        var data = "";
        if (postdata is string)
            data = postdata as string;
        else
            data = Newtonsoft.Json.JsonConvert.SerializeObject(postdata);
        TraceLog.m_Trace.Trace(uuid + method + " postdata=" + data); // write log 2
        if (iscache)
        {
            // return cache ...
        }
        var req = (HttpWebRequest)WebRequest.Create(url);
        req.Headers.Add("Cache-Control", "no-cache");
        req.Headers.Add("MethodName", method);
        req.Method = "POST";
        req.ContentType = "application/json";
        var send = Encoding.UTF8.GetBytes(data);
        req.ContentLength = send.Length;
        req.Timeout = 60 * 1000;
        var nsm = req.GetRequestStream();
        nsm.Write(send, 0, send.Length);
        nsm.Close();
        var resp = (HttpWebResponse)req.GetResponse();
        var sm = resp.GetResponseStream();
        var sr = new StreamReader(sm, Encoding.GetEncoding("utf-8"));
        rs = sr.ReadToEnd();
        sr.Close();
        sr.Dispose();
        sm.Close();
    }
    catch (Exception ex)
    {
        TraceLog.m_Trace.Trace(uuid + method + " ex=" + ex.ToString()); // write log 3
        return new BaseResponse(ex.Message).ToString();
    }
    if (iscache && rs.Contains("IsSuccess\":true,"))
    {
        TraceLog.m_Trace.Trace(uuid + key + " wrrite cache..."); / write log 4
        CacheHelper.Max(key, rs);
    }
    TraceLog.m_Trace.Trace(uuid + method + " rs=" + rs); // write log 5
    return rs;
}

Была ли у вас когда-нибудь эта проблема? Я гуглил два дня и не нашел подобного образца. Надеюсь получить вашу помощь! При каких обстоятельствах возникнет эта проблема и как ее решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...