Webサービスは時々大幅に遅くなります
-
19-09-2019 - |
質問
私の会社は、C#/ASP.NETで書かれているWebサービスの問題に遭遇しています。このサービスは、SQL ServerのデータのIDキーと、このデータのPDFレポートを生成および保存するパスを受信します。
ほとんどの場合、このWebサービスは、通常は数秒以内に、結果の結果を呼び出しWebページに非常に迅速に返します。
しかし、それは時々大きな減速に打撃を与えるようです。 Webサービスを呼び出すWebアプリケーションは、この減速が発生するとタイムアウトエラーが生成されます。チェックして、PDFが作成されてサーバーに保存されているため、Webサービスが最終的に実行が終了したように見えます。処理が完了するまでに約1〜2分かかるようです。 PDFは、データダイナミクスの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";
}
解決
短いメモ:あなたはあなたのStreamWriterを処分していません、そしておそらくあなたのサービスに他の使い捨てオブジェクトもあるかもしれません。これにより、アプリにメモリリークが発生する可能性があり、IISがワーカープロセスを再起動する可能性があります。これはおそらくあなたの問題の解決策ではありませんが、使い捨てのオブジェクトを処分することは将来の問題を防ぐのに役立ちます!
他のヒント
これがたまたま真の問題がどこにあるのかを確認するとき、IISをデバッグする必要があります。
を使用する必要があります IISデバッグ診断ツール 何が起こっているのかを判断するのに役立ちます。
私も読みます テスフェランデスのブログ IISの問題のデバッグについて。