Веб-сервис иногда значительно замедляется - PullRequest
0 голосов
/ 11 марта 2010

В моей компании возникла проблема с веб-службой, написанной на C # / ASP.Net. Служба получает ключ идентификации для данных в SQL Server и путь для создания и сохранения отчета PDF для этих данных.

В большинстве случаев этот веб-сервис очень быстро возвращает результаты на вызывающие веб-страницы, обычно в течение нескольких секунд.

Однако, похоже, иногда происходит значительное замедление. Веб-приложение, вызывающее веб-службу, генерирует ошибку тайм-аута, когда происходит это замедление. Мы проверили, и PDF-файл действительно создается и сохраняется на сервере, поэтому, похоже, веб-служба в конечном итоге завершает работу. Похоже, что обработка занимает от 1 до 2 минут. PDF создается с использованием ActiveReports из Data Dynamics.

Когда возникает эта проблема, внесение небольшого изменения в файл конфигурации веб-службы (т. Е. Добавление пробела в строку строки подключения), похоже, перезапускает веб-службу, и в течение некоторого времени все в порядке.

Другие веб-приложения, работающие на том же веб-сервере, похоже, не испытывают такого типа поведения, только этот конкретный веб-сервис.

Я добавил код для веб-службы ниже. Это базовые звонки в сторонние библиотеки. Мы не можем воссоздать эту проблему в тесте.

Мне интересно, что может быть причиной этой проблемы?

[WebMethod]
public string Publish(int identity, string transactionType, string directory, string filename)
{
    try
    {
        AdpConnection Conn = new AdpConnection(ConfigurationManager.AppSettings["myDBConnString"]);
        AdpCommand Cmd = new AdpCommand("storedproc_GetData", oConn);
        AdpParameter Param;

        Cmd.CommandType = CommandType.StoredProcedure;

        Param = Cmd.CreateParameter("@Identity", DbType.Int32);
        Param.Value = identity;
        Cmd.Parameters.Add(oParam);

        Conn.Open();
        string aResponse = Cmd.ExecuteScalar().ToString();
        Conn.Close();

        if (transactionType == "typeA")
        {
            //Parse response
            DataSet dsResponse = ParseDataResponse(aResponse);
            //dsResponse.WriteXml(@ConfigurationManager.AppSettings["DocsDir"] + identity.ToString() + ".xml");

            DataDynamics.ActiveReports.ActiveReport3 rpt = new DataDynamics.ActiveReports.ActiveReport3();

            rpt.LoadLayout(@ConfigurationManager.AppSettings["myReportPath"] + "TypeA.rpx");
            rpt.AddNamedItem("ReportPath", @ConfigurationManager.AppSettings["myReportPath"]);
            rpt.AddNamedItem("XMLSTRING", FormatXML(dsResponse.GetXml()));
            DataDynamics.ActiveReports.DataSources.XMLDataSource xmlds = new DataDynamics.ActiveReports.DataSources.XMLDataSource();
            xmlds.FileURL = null;
            xmlds.RecordsetPattern = "//DataPatternA";
            xmlds.LoadXML(FormatXML(dsResponse.GetXml()));

            if (!System.IO.Directory.Exists(@ConfigurationManager.AppSettings["DocsDir"] + directory + @"\"))
            {
                System.IO.Directory.CreateDirectory(@ConfigurationManager.AppSettings["DocsDir"] + directory + @"\");
            }

            string sXML = FormatXML(dsResponse.GetXml());
            StreamWriter sw = new StreamWriter(@ConfigurationManager.AppSettings["DocsDir"] + directory + @"\" + filename + ".xml", false);
            sw.Write(sXML);
            sw.Close();

            rpt.DataSource = xmlds;
            rpt.Run(true);

            DataDynamics.ActiveReports.Export.Pdf.PdfExport xPdf = new DataDynamics.ActiveReports.Export.Pdf.PdfExport();


            xPdf.Export(rpt.Document, @ConfigurationManager.AppSettings["DocsDir"] + directory + @"\" + filename + ".pdf");

        }

    }
    catch(Exception ex)
    {
        return "Error: " + ex.ToString();
    }

    return @ConfigurationManager.AppSettings["DocsDir"] + directory + @"\" + filename + ".pdf";
}

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

Просто короткое примечание: вы не утилизируете свой StreamWriter и, возможно, в вашем сервисе есть и другие одноразовые объекты.Это может привести к утечке памяти в вашем приложении, что может привести к перезапуску IIS вашего рабочего процесса.Хотя это, вероятно, не решит вашу проблему, утилизация одноразовых предметов поможет предотвратить будущие проблемы!

2 голосов
/ 12 марта 2010

Вам нужно будет отладить IIS, когда это случится, чтобы увидеть, в чем истинная проблема.

Вам следует использовать IIS Debug Diagnostics Tool , чтобы помочь вам определить, что происходит.

Я бы также прочитал блог Тесс Феррандез об устранении неполадок IIS.

...