2010-03-11 4 views
0

저희 회사는 C#/ASP.Net로 작성된 웹 서비스에 문제가 있습니다. 이 서비스는 SQL Server의 데이터에 대한 ID 키와이 데이터에 대한 PDF 보고서를 생성하고 저장하는 경로를받습니다.웹 서비스가 가끔씩 느려집니다.

대부분의 경우이 웹 서비스는 결과를 호출하는 웹 페이지에 매우 신속하게 대개 몇 초 이내에 반환합니다.

그러나 때때로 심각한 속도 저하를 초래하는 것으로 보입니다. 이 속도 저하가 발생하면 웹 서비스를 호출하는 웹 응용 프로그램에서 시간 초과 오류가 발생합니다. 확인한 결과 PDF가 생성되어 서버에 저장되므로 결국 웹 서비스가 실행되는 것처럼 보입니다. 처리가 완료되는 데 약 1 ~ 2 분이 소요되는 것 같습니다. PDF는 데이터 역학의 ActiveReports를 사용하여 생성됩니다.

이 문제가 발생하면 웹 서비스의 구성 파일을 약간 변경 (예 : 연결 문자열 줄에 공백 추가)하여 웹 서비스를 다시 시작한 것으로 보이며 나중에 일정 기간 동안 모든 것이 완벽하게 확인됩니다.

동일한 웹 서버에서 실행되는 다른 웹 응용 프로그램에서는 이러한 특정 웹 서비스 만 이러한 유형의 동작이 발생하지 않는 것처럼 보입니다.

아래 웹 서비스 코드를 추가했습니다. 타사 라이브러리에 대한 기본 호출입니다. 테스트에서이 문제를 재현 할 수는 없습니다.

이 문제의 원인은 무엇입니까?

[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에서 작업자 프로세스를 다시 시작할 수있는 메모리 누수가 발생할 수 있습니다. 이것은 아마도 문제의 해결 방법이 아니지만 일회용 개체를 폐기하면 향후 문제를 예방하는 데 도움이됩니다!

관련 문제