私の会社では、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";
}