Вопрос

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

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

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

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

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

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

Мне интересно, что может вызвать эту проблему?

[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";
}
Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top