Por que chamar um serviço da Web mais lento de uma página da web?

Temos uma DLL usada como a camada intermediária entre o front end do nosso site e nosso sistema de bilhetagem de back-end. O método de inserção no sistema de bilhética é um pouco complicado de explicar, mas a versão curta é que é lenta. O melhor cenário que recebi é um tempo de envio de 9 segundos.

O problema real, porém, é que eu só posso obter esse tempo através de um aplicativo do Windows, não através de um site da Web ASP.NET. Configurei um aplicativo de teste do Windows e uma página da Web para teste e, embora o código seja copiado entre eles, a página da Web está enviando consistentemente em 17 a 20 segundos, enquanto o aplicativo do Windows está recebendo de 8 a 11 segundos.

O que poderia estar causando isso?

EDIT: Em resposta a algumas das respostas ...

A chamada para o serviço da Web está ocupando a maior parte do tempo, mas não tenho controle sobre esse serviço da Web, pois ele é fornecido pelo fornecedor do sistema de emissão de tickets. Preciso descobrir por que o serviço da web está tomando diferentes quantidades de tempo quando está sendo chamado de um tipo diferente de aplicativo. O código é exatamente o mesmo em ambos os casos, e está executando um loop, reportando os tempos registrados.

O código é:

for (int i = 0; i < numIterations; i++)
        {
            startTimes[i] = DateTime.Now;

            try
            {
                cvNum = Clearview.Submit(req, DateTime.Now, DateTime.Now, false);
            }
            catch (Exception ex)
            {
                exceptionCount++;
                lblResult.Text += @"
Exception Caught: " + ex.Message + @"
"; } endTimes[i] = DateTime.Now; }

É o mesmo loop em ambos os casos, e estou marcando a hora certa antes e depois da chamada para a biblioteca, que faz o processamento adicional e, em seguida, chama o serviço da web. Mas esse processamento deve ser consistente, não é? Eu travei durante a depuração e não vi nenhum atraso na chamada real de serviço da web ...

EDITAR Novamente: Trabalhando com Ants, em ambos os casos, 99,4% do tempo está sendo enviado apenas na chamada de serviço da web. Parece não haver nenhuma diferença lá ... exceto que quando o tempo limite da página da web está demorando mais do que o aplicativo do Windows.

1
Não tenho certeza do que você quer dizer...?
adicionado o autor CodeRedick, fonte
Teste entre dois backends de serviço da web diferentes: gerou o Reference.CS em um caso e o WebClient em outro. A referência é gerada dentro de um .DLL usado pelo aplicativo do Windows e pela página da web.
adicionado o autor CodeRedick, fonte
quais clientes do Windows e da Web você está usando para os serviços da Web?
adicionado o autor Mark Cidade, fonte
Você está usando o HttpWebRequest, um Reference.cs gerado, um cliente da Web do lado do cliente JavaScript ou o que?
adicionado o autor Mark Cidade, fonte

3 Respostas

Potencialmente, a localização do serviço da Web em relação ao servidor da Web pode estar causando um problema. Além disso, a estrutura da página e outros processamentos dentro da sua interface do usuário da web podem estar tendo um impacto no tempo que o aplicativo leva para processar.

Como mencionado, registrar itens em ambos os lados é uma ótima idéia, se isso não lhe der o que você precisa, você pode tentar um profiler de desempenho como Ants Profiler da Red Gate que pode ajudar a identificar a linha, método ou classe que está usando a maior parte do tempo.

2
adicionado
Eu estaria olhando para Ants Profiler neste caso, olhe para tempos de execução de loop. Além disso, as exceções estão sendo lançadas mais em um caso do que em outro? Exceções são caras.
adicionado o autor Mitchel Sellers, fonte
Ok, veja se as formigas entre os dois aplicativos podem isolar uma linha específica que está tendo mais esforço.
adicionado o autor Mitchel Sellers, fonte
Acabei de adicionar editado em mais algumas informações. Eu não tenho acesso aos componentes internos do serviço da Web, mas não sei por que isso teria importância ...
adicionado o autor CodeRedick, fonte
Além disso, como estou testando em meu desktop, o serviço da Web está no mesmo lugar para os dois clientes ...
adicionado o autor CodeRedick, fonte
Jogando com formigas agora, mas sem exceções estão sendo lançadas.
adicionado o autor CodeRedick, fonte
É a chamada para o serviço da web, como eu suspeitava. 99% do tempo é só nessa ligação ...
adicionado o autor CodeRedick, fonte

Salpique seu aplicativo em ambos os lados com logs - isso mostrará aonde está indo o tempo. Se isso não ajudar, use o Wireshark para rastrear a atividade da rede.

1
adicionado

Você está executando ambos na mesma máquina? A camada intermediária que você está chamando está localizada em uma máquina remota? As durações de tempo que você mencionou parecem vagamente um problema de tempo limite de DNS, quando a abertura de uma conexão incorre em penalidade pela primeira resposta de DNS (descendente/mal endereçada) ao tempo limite. Tem certeza de que o arquivo de configuração/var apontando a DLL para a camada intermediária é o mesmo em ambas as invocações?

Eu sigo a sugestão de usar o Wireshark para ver o que está acontecendo. Você pode pelo menos se certificar de que o tempo de processamento de backend é (de qualquer forma) o mesmo ...

1
adicionado
Era um problema de configuração, um estava sendo enviado para o sistema de produção, embora ambos estivessem usando o serviço da web correto. A diferença de tempo foi por causa de quanto mais ocupado o banco de dados de produtos é aparentemente. Honestamente, não tenho certeza por que funcionou ... Obrigado embora!
adicionado o autor CodeRedick, fonte