Frage

Mein Unternehmen stößt auf ein Problem mit einem Webdienst, der in C#/ASP.NET geschrieben ist. Der Dienst erhält einen Identitätsschlüssel für Daten in SQL Server und einen Pfad zum Generieren und Speichern eines PDF -Berichts für diese Daten.

In den meisten Fällen gibt dieser Webdienst die Ergebnisse sehr schnell auf die aufrufenden Webseiten zurück, normalerweise innerhalb weniger Sekunden max.

Es scheint jedoch gelegentlich eine erhebliche Verlangsamung zu treffen. Die Webanwendung, die den Webdienst aufruft, generiert einen Zeitüberschreitungsfehler, wenn diese Verlangsamung stattfindet. Wir haben überprüft und der PDF wird erstellt und auf dem Server gespeichert. Daher sieht es so aus, als ob der Webdienst schließlich ausgeführt wird. Es scheint ungefähr 1 bis 2 Minuten zu dauern, bis die Verarbeitung abgeschlossen ist. Das PDF wird unter Verwendung von ActiveReports aus der Datendynamik generiert.

Wenn dieses Problem auftritt, scheint die Konfigurationsdatei des Webdienstes (dh das Hinzufügen eines leeren Speicherplatzes zu einer Verbindungszeichenfolge) den Webdienst neu zu starten, und alles ist danach für einen bestimmten Zeitraum in Ordnung.

Andere Webanwendungen, die auf demselben Webserver ausgeführt werden, scheinen diese Art von Verhalten nicht zu erleben, sondern nur diesen bestimmten Webdienst.

Ich habe den Code für den Webdienst unten hinzugefügt. Es sind grundlegende Anrufe an Bibliotheken von Drittanbietern. Wir sind nicht in der Lage, dieses Problem im Test wieder herzustellen.

Ich frage mich, was dieses Problem verursachen könnte.

[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";
}
War es hilfreich?

Lösung

Nur eine kurze Anmerkung: Sie entsorgen Ihren Streamwriter nicht und vielleicht gibt es auch andere verfügbare Objekte in Ihrem Dienst. Dies kann zu einem Speicherleck in Ihrer App führen, das den IIS dazu veranlassen könnte, Ihren Arbeitsprozess neu zu starten. Auch wenn dies wahrscheinlich nicht die Lösung für Ihr Problem ist, hilft die Entsorgung von Einwegobjekten, um zukünftige Probleme zu verhindern!

Andere Tipps

Sie müssen IIS debuggen, wenn dies zufällig erstellt, wo das wahre Problem liegt.

Sie sollten die verwenden IIS -Debug -Diagnostik -Tool um Ihnen zu helfen, zu bestimmen, was passiert.

Ich würde auch lesen Tess Ferrandez 'Blog beim Debuggen von IIS -Problemen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top