Domanda

La mia azienda è in esecuzione in un problema con un servizio web che è scritto in C # / ASP.Net. Il servizio riceve una chiave di identità per i dati in SQL Server e un percorso per generare e salvare un report in formato PDF per questi dati.

Nella maggior parte dei casi, questo servizio Web restituisce risultati alle pagine web che richiedono molto rapidamente, di solito nel giro di pochi secondi max.

Tuttavia, sembra colpire di tanto in tanto un significativo rallentamento. L'applicazione web chiamata al servizio web genererà un errore di timeout quando si verifica questo rallentamento. Abbiamo controllato e il PDF fa arrivare creato e salvato sul server, così sembra che il servizio web eventualmente termina l'esecuzione. Sembra prendere circa 1 a 2 minuti per l'elaborazione di aver completato. Il PDF viene generato utilizzando ActiveReports dai dati Dynamics.

Sse si verifica questo problema, facendo una piccola modifica al file di configurazione del servizio web (ad esempio, l'aggiunta di uno spazio vuoto per una linea di stringa di connessione) sembra riavviare il servizio web e tutto è perfettamente ok per un periodo di tempo dopo.

Altre applicazioni web che sono in esecuzione sullo stesso server web non sembrano sperimentare questo tipo di comportamento, solo che questa particolare servizio web.

Ho aggiunto il codice per il servizio web di seguito. Si tratta di chiamate di base alle librerie 3rd party. Non siamo in grado di ricreare il problema in esame.

Mi chiedo che cosa potrebbe causare questo problema?

[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";
}
È stato utile?

Soluzione

Solo una breve nota: Non stai Smaltimento del StreamWriter e forse ci sono altri oggetti usa e getta nel servizio, anche. Ciò potrebbe causare una perdita di memoria nella vostra applicazione che potrebbe portare IIS per riavviare il processo di lavoro. Anche se questo probabilmente non sarà la soluzione al vostro problema, disponendo gli oggetti usa e getta aiuterà a prevenire problemi futuri!

Altri suggerimenti

Si sta andando ad avere per eseguire il debug di IIS quando questo accade per vedere dove il vero problema.

Si dovrebbe usare la IIS Debug Diagnostics Tool per aiutare a determinare cosa sta succedendo.

Vorrei anche leggere di Tess Ferrandez blog il debug di IIS problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top