TimoutException происходит по сети, но не локально - PullRequest
2 голосов
/ 24 марта 2010

У меня есть программа с тремя службами WCF, и когда я запускаю их локально (т.е. все серверы и клиенты находятся на локальном хосте), все работает. Однако, когда я тестирую их по сети, я получаю исключение TimoutException для двух служб, но не для другого. Я отключил брандмауэры на всех машинах, участвующих в тесте. Я могу одновременно пропинговать сервер и получить доступ к веб-странице wsdl «Вы создали сервис» с клиента

Служба, которая работает, использует BasicHttpBinding с потоковой передачей, а две неработающие - WSDualHttpBinding. Службы, использующие WSDualHttpBinding, имеют CallbackContracts. Я прошу прощения за неопределенность этого вопроса, но я не совсем уверен, какой код включить или где вообще начать искать решение этого вопроса.

нерабочие привязки:

public static Binding CreateHTTPBinding()
{
  var binding = new WSDualHttpBinding();

  binding.MessageEncoding = WSMessageEncoding.Mtom;

  binding.MaxBufferPoolSize = 2147483647;
  binding.MaxReceivedMessageSize = 2147483647;
  binding.Security.Mode = WSDualHttpSecurityMode.None;
  return binding;
}

Трассировка стека исключений:

Unhandled Exception: System.TimeoutException: The open operation did not complete within the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout.

Server stack trace:
   at System.ServiceModel.Channels.ReliableRequestor.ThrowTimeoutException()
   at System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout)
   at System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ClientReliableDuplexSessionChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
   at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at IDemeService.Register()
   at DemeServiceClient.Register()
   at DemeClient.Client.Start()
   at DemeClient.Program.Main(String[] args)

Ответы [ 2 ]

0 голосов
/ 07 марта 2013

Вы используете DualHttpBinding. Это означает, что вы устанавливаете дуплексный канал, где сервер может отправлять сообщения (не ответное сообщение, а входящее сообщение) клиенту. Но вы не настроили clientBaseAddress, где клиент будет прослушивать входящие сообщения с сервера. Это то, что вызывает эту проблему. от http://msdn.microsoft.com/en-us/library/system.servicemodel.wsdualhttpbinding.aspx:

Эта привязка требует, чтобы у клиента был открытый URI, который предоставляет конечную точку обратного вызова для службы. Это обеспечивается ClientBaseAddress. Двойная привязка предоставляет сервису IP-адрес клиента. Клиент должен использовать безопасность, чтобы гарантировать, что он подключается только к сервисам, которым доверяет.

0 голосов
/ 27 марта 2010

Вы можете включить трассировку System.Net с обеих сторон и прочитать об исключении тайм-аута.

http://support.microsoft.com/kb/947285

...