Pergunta

Minha empresa está enfrentando um problema com um serviço da Web escrito em C#/ASP.Net.O serviço recebe uma chave de identidade para os dados no SQL Server e um caminho para gerar e salvar um relatório em PDF para esses dados.

Na maioria dos casos, este serviço web retorna resultados para as páginas web chamadoras muito rapidamente, geralmente dentro de alguns segundos no máximo.

No entanto, parece ocasionalmente atingir uma desaceleração significativa.O aplicativo da web que chama o serviço da web gerará um erro de tempo limite quando ocorrer essa lentidão.Verificamos e o PDF foi criado e salvo no servidor, então parece que o serviço da web finalmente termina a execução.Parece que leva cerca de 1 a 2 minutos para que o processamento seja concluído.O PDF é gerado usando ActiveReports da Data Dynamics.

Quando esse problema ocorre, fazer uma pequena alteração no arquivo de configuração do serviço web (ou seja, adicionar um espaço em branco a uma linha de string de conexão) parece reiniciar o serviço web e tudo fica perfeitamente ok por um período de tempo depois.

Outros aplicativos da web em execução no mesmo servidor da web não parecem experimentar esse tipo de comportamento, apenas esse serviço da web específico.

Eu adicionei o código para o serviço da web abaixo.São chamadas básicas para bibliotecas de terceiros.Não conseguimos recriar esse problema no teste.

Eu estou querendo saber o que pode estar causando esse problema?

[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";
}
Foi útil?

Solução

Apenas uma breve nota:Você não está descartando seu StreamWriter e talvez existam outros objetos descartáveis ​​em seu serviço também.Isso pode causar um vazamento de memória no seu aplicativo, o que pode levar o IIS a reiniciar o processo de trabalho.Mesmo que essa provavelmente não seja a solução para o seu problema, o descarte de objetos descartáveis ​​ajudará a prevenir problemas futuros!

Outras dicas

Você terá que depurar o IIS quando isso vê onde está o verdadeiro problema.

Você deve usar o Ferramenta de diagnóstico de depuração do IIS Para ajudá -lo a determinar o que está acontecendo.

Eu também leria Blog de Tess Ferrandez em depurar problemas do IIS.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top