Question

Mon entreprise est en cours d'exécution dans un problème avec un service Web qui est écrit en C # / ASP.Net. Le service reçoit une clé d'identité pour les données dans SQL Server et un chemin pour générer et enregistrer un rapport PDF pour ces données.

Dans la plupart des cas, ce service renvoie Web résultats aux pages Web d'appel très rapidement, généralement en quelques secondes max.

Cependant, il semble parfois frapper un ralentissement significatif. L'application Web appelant le service Web génère une erreur de délai d'attente lorsque ce ralentissement se produit. Nous avons vérifié et le PDF ne soit créé et enregistré sur le serveur, il semble que le service Web a finalement terminé l'exécution d'. Il semble prendre environ 1 à 2 minutes pour le traitement d'avoir terminé. Le PDF est généré à l'aide de données ActiveReports Dynamics.

Llorsque ce problème se produit, ce qui rend une petite modification du fichier de configuration de service Web (par exemple, l'ajout d'un espace vide à une ligne de chaîne de connexion) semble redémarrer le service Web et tout est parfaitement correct pour une période de temps après.

D'autres applications Web qui sont en cours d'exécution sur le même serveur Web ne semblent pas faire l'expérience de ce type de comportement, que ce service particulier web.

J'ai ajouté le code pour le service Web ci-dessous. Il est des appels de base aux bibliothèques 3ème partie. Nous ne sommes pas en mesure de recréer ce problème dans le test.

Je me demande ce qui pourrait être la cause de ce problème?

[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";
}
Était-ce utile?

La solution

Juste une petite note: Vous n'êtes pas votre StreamWriter et débarrassez peut-être il y a d'autres objets à usage unique dans votre service, aussi. Cela pourrait provoquer une fuite de mémoire dans votre application qui pourrait conduire IIS pour redémarrer votre processus de travail. Même si ce ne sera probablement pas la solution à votre problème, la disposition des objets jetables aidera à prévenir les problèmes futurs!

Autres conseils

Vous allez avoir à déboguer IIS lorsque cela se produit pour voir où le vrai problème.

Vous devez utiliser le IIS Outil de diagnostic de débogage pour vous aider à déterminer ce qui se passe.

Je lirais aussi blog de Tess Ferrandez sur le débogage IIS problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top