سؤال

تعمل شركتي في مشكلة مع خدمة ويب مكتوبة في 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";
}
هل كانت مفيدة؟

المحلول

مجرد ملاحظة قصيرة: أنت لا تتخلص من كتاب Stream الخاص بك وربما هناك أشياء أخرى يمكن التخلص منها في خدمتك، أيضا. قد يتسبب ذلك في تسرب الذاكرة في تطبيقك الذي يمكن أن يؤدي إلى إعادة تشغيل IIS لإعادة تشغيل عملية العمال الخاصة بك. على الرغم من أن هذا ربما لن يكون الحل لمشكلتك، فإن التخلص من الكائنات المتاح سيساعد على منع مشاكل المستقبل!

نصائح أخرى

ستضطر إلى تصحيح IIS عندما يحدث هذا لمعرفة أين تكمن المشكلة الحقيقية.

يجب عليك استخدام أداة تشخيص التصحيح IIS لمساعدتك في تحديد ما يحدث.

سأقرأ أيضا بلوق تيس فيرانديز على تصحيح مشاكل IIS.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top