Aumentando o valor do tempo limite em um serviço WCF

133

Como aumentar o tempo limite padrão para mais de 1 minuto em um serviço WCF?

Blankman
fonte
O que não está claro, mas acho que você está perguntando implicitamente, é se é possível configurar no lado do servidor ou não o tempo limite de todas as chamadas que demoram mais de um minuto para serem processadas. Isso não é possível
gravidThoughts

Respostas:

196

Você está se referindo ao servidor ou ao cliente?

Para um cliente, você deseja ajustar o atributo sendTimeout de um elemento de ligação. Para um serviço, você deseja ajustar o atributo receiveTimeout de uma ligação elenente.

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>

  <services>
    <service name="longTimeoutService"
      behaviorConfiguration="longTimeoutBehavior">
      <endpoint address="net.tcp://localhost/longtimeout/"
        binding="netTcpBinding" bindingConfiguration="longTimeoutBinding" />
    </service>
....

Obviamente, você precisa mapear o terminal desejado para essa ligação específica.

icelava
fonte
Como mapeio a ligação, usando 'bindingname' dentro da tag do terminal?
194 Blankman
Isso está simplesmente errado. No receiveTimeoutlado do servidor, governa a determinação da ociosidade para ligações baseadas em sessão. Por exemplo, o servidor não usará essa configuração para ligações basicHTTP. Você tem que rolar seus próprios limites de tempo de processamento do lado do servidor para WCF
gravidThoughts
45

No menu Ferramentas do Visual Studio 2008 (ou 2005, se você tiver o material certo do WCF instalado), há uma opção chamada 'Editor de configuração de serviço do WCF'.

A partir daí, você pode alterar as opções de ligação para o cliente e os serviços, uma dessas opções será para tempos limite.

Kieron
fonte
A ferramenta é uma ótima maneira de evitar erros, como agrupar os elementos da maneira errada, ortografia etc. Boa chamada!
Markaaronky
ver também aqui para a outra ferramenta para abrir os arquivos de log: stackoverflow.com/a/34283667/187650
jufo
8

Você pode escolher duas maneiras:

1) Por código no cliente

public static void Main()
{
    Uri baseAddress = new Uri("http://localhost/MyServer/MyService");

    try
    {
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService));

        WSHttpBinding binding = new WSHttpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

        serviceHost.AddServiceEndpoint("ICalculator", binding, baseAddress);
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

    }
    catch (CommunicationException ex)
    {
        // Handle exception ...
    }
}

2) Pelo WebConfig em um servidor web

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Para mais detalhes, veja as documentações oficiais

Configurando valores de tempo limite em uma ligação

Classe WSHttpBinding

daniele3004
fonte
0

Além dos tempos limite de ligação (que estão em Timespans), você também pode precisar disso. Isso é em segundos.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Derreck Dean
fonte