Время ожидания службы WCF - PullRequest
       0

Время ожидания службы WCF

0 голосов
/ 15 сентября 2010

Я создаю службу WCF, и время ожидания истекает, когда она используется в некоторых моих интеграционных тестах.Я был в состоянии сузить это, и это демонстрируется следующим кодом.Похоже, что создание формы до создания хоста вызывает проблему, но я не уверен, почему.

class Program
{
    [ServiceContract]
    public interface IMyContract
    {
        [OperationContract]
        void Ping();
    }
    public class MyContract : IMyContract
    {
        public void Ping()
        {
            Console.WriteLine("Ping");
        }
    }
    public class MyContractProxy : ClientBase<IMyContract>, IMyContract
    {
        public MyContractProxy(int port)
            : base(new NetTcpBinding { SendTimeout = TimeSpan.FromSeconds(5) }, new EndpointAddress(string.Format("net.tcp://localhost:{0}", port)))
        {
        }

        public void Ping()
        {
            Channel.Ping();
        }
    }

    static void Main(string[] args)
    {
        try
        {
            new Form();
            var host = new ServiceHost(typeof(MyContract));
            host.AddServiceEndpoint(typeof(IMyContract), new NetTcpBinding(), "net.tcp://localhost:12345");
            host.Open();

            var proxy = new MyContractProxy(12345);
            proxy.Open();
            proxy.Ping();
        }
        catch (Exception e)
        {
            Console.Error.WriteLine(e);
        }
    }
}

1 Ответ

2 голосов
/ 15 сентября 2010

Форма изменяет поведение вашего сервиса - ваш прокси и сервис работают в одном потоке.

Существует разница в хостинге в потоке пользовательского интерфейса и не в потоке пользовательского интерфейса.Когда вы размещаете службу в потоке без пользовательского интерфейса, служба создает новый поток для обработки запроса.Если вы размещаете службу в потоке пользовательского интерфейса (это происходит, если вы запускаете там какую-либо форму WinForm или WPF), по умолчанию новые потоки не используются.Вместо этого он обрабатывает входящие вызовы как часть стандартного цикла сообщений Windows.

Добавьте ServiceBehavior, чтобы избежать этого поведения:

[ServiceBehavior(UseSynchronizationContext=false)]
public class MyContract : IMyContract
{ ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...