0

我的公司遇到了一个用 C#/ASP.Net 编写的 Web 服务的问题。该服务接收 SQL Server 中数据的标识密钥以及为该数据生成和保存 PDF 报告的路径。

在大多数情况下,此 Web 服务会非常快速地将结果返回到调用网页,通常最多在几秒钟内。

但是,它似乎偶尔会出现显着放缓。发生这种减速时,调用 Web 服务的 Web 应用程序将生成超时错误。我们已经检查并且 PDF 确实被创建并保存到服务器,所以看起来 Web 服务最终完成了执行。处理完成似乎需要大约 1 到 2 分钟。PDF 是使用来自 Data Dynamics 的 ActiveReports 生成的。

当出现此问题时,对 Web 服务的配置文件进行小幅更改(即,在连接字符串行中添加一个空格)似乎会重新启动 Web 服务,并且在之后的一段时间内一切正常。

在同一 Web 服务器上运行的其他 Web 应用程序似乎没有遇到这种行为,只有这个特定的 Web 服务。

我在下面添加了 Web 服务的代码。这是对 3rd 方库的基本调用。我们无法在测试中重现此问题。

我想知道是什么导致了这个问题?

[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 调试诊断工具来帮助您确定发生了什么。

我还会阅读Tess Ferrandez 的关于调试 IIS 问题的博客。

于 2010-03-11T21:05:48.693 回答