2010-03-11 69 views
0

我的公司遇到了用C#/ ASP.Net編寫的Web服務的問題。該服務接收SQL Server中的數據的身份密鑰以及生成並保存此數據的PDF報告的路徑。Web服務偶爾會顯着減慢

在大多數情況下,該Web服務會將結果非常快速地返回到調用網頁,通常在幾秒鐘內最多。

但是,它似乎偶爾會出現明顯的放緩。調用Web服務的Web應用程序在發生這種放緩時會產生超時錯誤。我們已經檢查過,並且PDF已經被創建並保存到服務器,所以看起來Web服務最終會執行完畢。似乎需要大約1到2分鐘才能完成處理。 PDF是使用Data Dynamics的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"; 
} 

回答

3

只需簡短註釋: 您不會丟棄StreamWriter,也可能在您的服務中還有其他一次性對象。這可能會導致應用程序內存泄漏,從而導致IIS重新啓動工作進程。 即使這可能不會解決您的問題,處置一次性物體將有助於防止未來的問題!