我的公司遇到了使用C#/ ASP.Net编写的Web服务的问题。该服务接收SQL Server中数据的标识密钥以及为此数据生成和保存PDF报告的路径。
在大多数情况下,此Web服务会非常快速地将结果返回到调用的网页,通常最多只需几秒钟。
然而,它似乎偶尔会出现明显的放缓。调用Web服务的Web应用程序将在发生此减速时生成超时错误。我们检查了PDF并确实创建并保存到服务器,因此看起来Web服务最终完成执行。处理完成似乎需要大约1到2分钟。 PDF是使用Data Dynamics的ActiveReports生成的。
当出现此问题时,对Web服务的配置文件进行少量更改(即向连接字符串行添加空格)似乎重新启动Web服务,之后一段时间内一切都完好无损。< / p>
在同一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";
}
答案 0 :(得分:3)
简短说明: 您没有丢弃StreamWriter,也许您的服务中还有其他一次性对象。这可能会导致应用程序中的内存泄漏,从而导致IIS重新启动您的工作进程。 即使这可能不是您问题的解决方案,处理一次性物品也有助于防止将来出现问题!
答案 1 :(得分:2)
当发生这种情况时,您将不得不调试IIS以查看真正的问题所在。
您应该使用IIS Debug Diagnostics Tool来帮助您确定发生了什么。
我还会在调试IIS问题时阅读Tess Ferrandez's blog。