0

私の会社では、C#/ASP.Netで記述されたWebサービスで問題が発生しています。このサービスは、SQL ServerのデータのIDキーと、このデータのPDFレポートを生成して保存するためのパスを受け取ります。

ほとんどの場合、このWebサービスは、結果を呼び出し元のWebページに非常に迅速に、通常は最大数秒以内に返します。

ただし、場合によっては大幅な速度低下が発生するようです。この速度低下が発生すると、Webサービスを呼び出すWebアプリケーションはタイムアウトエラーを生成します。確認したところ、PDFが作成されてサーバーに保存されているため、最終的にWebサービスの実行が終了したように見えます。処理が完了するまでに1〜2分程度かかるようです。PDFは、DataDynamicsのActiveReportsを使用して生成されます。

この問題が発生した場合、Webサービスの構成ファイルに小さな変更を加える(つまり、接続文字列行に空白を追加する)と、Webサービスが再起動するように見え、その後しばらくの間、すべてが完全に正常になります。

同じWebサーバーで実行されている他のWebアプリケーションでは、このタイプの動作は発生しないようです。この特定のWebサービスのみが発生します。

以下にWebサービスのコードを追加しました。これは、サードパーティのライブラリへの基本的な呼び出しです。テストでこの問題を再現することはできません。

この問題の原因は何でしょうか。

[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";
}
4

2 に答える 2

3

ちょっとしたメモ: StreamWriter を破棄しているのではなく、サービスに他の破棄可能なオブジェクトもある可能性があります。これにより、アプリでメモリ リークが発生し、IIS がワーカー プロセスを再起動する可能性があります。これはおそらく問題の解決策にはなりませんが、使い捨てオブジェクトを処分することは、将来の問題を防ぐのに役立ちます!

于 2010-03-11T21:12:56.827 に答える
2

真の問題がどこにあるのかを確認するには、これが発生したときに IIS をデバッグする必要があります。

IIS Debug Diagnostics Toolを使用して、何が起こっているかを判断する必要があります。

また、IIS の問題のデバッグに関するTess Ferrandez のブログも読みます。

于 2010-03-11T21:05:48.693 に答える