Serviço WCF, como aumentar o tempo limite?

93

Pode parecer uma pergunta boba, mas tudo no WCF parece muito mais complicado do que no asmx. Como posso aumentar o tempo limite de um serviço svc?

Aqui está o que tenho até agora:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

E então meu endpoint é mapeado assim:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

O erro exato que estou recebendo:

O canal de solicitação atingiu o tempo limite enquanto aguardava uma resposta após 00: 00: 59.9990000. Aumente o valor de tempo limite passado para a chamada para Request ou aumente o valor SendTimeout na Ligação. O tempo alocado para esta operação pode ter sido uma parte de um tempo limite mais longo.

No WCF Test Client, há um ícone de configuração que contém a configuração de tempo de execução do meu serviço:

Como você pode ver, não são os mesmos valores que defini para ele? O que estou fazendo de errado?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
JL.
fonte

Respostas:

179

Em sua configuração de vinculação, existem quatro valores de tempo limite que você pode ajustar:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

O mais importante é o sendTimeout, que indica quanto tempo o cliente aguardará por uma resposta do serviço WCF. Você pode especificar hours:minutes:secondsnas suas configurações - na minha amostra, eu defino o tempo limite para 25 minutos.

O openTimeoutcomo o nome indica é a quantidade de tempo que você está disposto a esperar quando você abre a conexão com o serviço WCF. Da mesma forma, closeTimeouté a quantidade de tempo que você aguardará, ao fechar a conexão (descartar o proxy do cliente), antes que uma exceção seja lançada.

O receiveTimeouté um pouco como um espelho para o sendTimeout- enquanto o tempo limite de envio é a quantidade de tempo que você esperará por uma resposta do servidor, receiveTimeouté a quantidade de tempo que você dará ao cliente para receber e processar a resposta do servidor.

No caso de você enviar mensagens "normais" para a frente e para trás, ambas podem ser bem curtas - especialmente receiveTimeout, uma vez que receber uma mensagem SOAP, descriptografar, verificar e desserializar deve levar quase nenhum tempo. A história é diferente com o streaming - nesse caso, você pode precisar de mais tempo no cliente para realmente concluir o "download" do stream que você recebe de volta do servidor.

Também há openTimeout, receiveTimeout e closeTimeout. Os documentos do MSDN sobre vinculação fornecem mais informações sobre sua finalidade.

Para ter um controle sério de todas as complexidades do WCF, eu recomendo fortemente que você compre o livro " Learning WCF " de Michele Leroux Bustamante:

Learning WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

e você também passa algum tempo assistindo sua série de screencast de 15 partes " WCF Top to Bottom " - altamente recomendado!

Para tópicos mais avançados, recomendo que você verifique o livro de Juwal Lowy Programming WCF Services.

Programação WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

marc_s
fonte
Tentei adicionar as seções de ligação a <system.serviceModel> em web.config, mas agora está gerando um erro ... quaisquer etapas adicionais que perdi ...
JL.
Eu também alterei o ponto de extremidade em meu serviço para <endpoint address = "" binding = "AumentedTimeout" - é a coisa errada a fazer?
JL.
Acho que entendi - binding = "basicHttpBinding" bindingConfiguration = "AumentedTimeout"
JL.
exatamente - a ligação é o tipo de protocolo que você usa - basicHttp, wsHttp, netTcp. A configuração de ligação é esta configuração que você cria na configuração para modificar os tempos limite etc.
marc_s
Engraçado mesmo depois de fazer isso, ainda obtendo um erro de tempo limite, Marc, você pode fornecer o máximo de informações possível?
JL.
27

A melhor maneira é alterar qualquer configuração desejada em seu código.

Confira o exemplo abaixo:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
user3891644
fonte
esta é uma solução melhor em vez de atualizar a configuração para que eu possa configurar um valor diferente para diferentes chamadas e serviços, muito obrigado
Salim
26

A configuração do tempo limite precisa ser definida no nível do cliente, portanto, a configuração que eu estava definindo no web.config não teve efeito, a ferramenta de teste do WCF tem sua própria configuração e é aí que você precisa definir o tempo limite.

JL.
fonte
1
bem, sim - normalmente, tem que ser definido no cliente e no servidor, mesmo - por exemplo, no caso de "inactivityTimeout" em sessões e coisas assim.
marc_s
8
JL: você pode mostrar o que exatamente você fez? estou tendo o mesmo problema
Nick Kahn
Se você estiver usando o 'WCF Test Client', clique com o botão direito do mouse em 'Config File' na árvore do serviço, clique em 'Edit with SvcConfigEditor' e altere o tempo limite nas ligações.
Radderz de
4

Recebi o mesmo erro recentemente, mas foi capaz de corrigi-lo garantindo o fechamento de todas as chamadas do cliente wcf. por exemplo.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

ou

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}
Arjaye
fonte
10
Não use a abordagem 'usando': omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall
Nos comentários de omaralzabir.com/do-not-use-using-in-wcf-client , há exemplos de como ainda usar usingsem descartar um objeto de canal com falha. Aqui está outro blogueiro com uma abordagem mais compatível com usingblocos: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Greg