TimeoutException, когда WCF-хост и клиент находятся в одном процессе - PullRequest
1 голос
/ 02 января 2011

Я столкнулся с действительно странной проблемой.Я создаю сильно распределенное приложение, в котором каждый экземпляр приложения может быть хостом и / или клиентом для WCF-службы (очень похожей на p2p).Все работает нормально, пока клиент и целевой хост (под которым я имею в виду приложение, а не хост, поскольку в настоящее время все работает на одном компьютере (так что нет проблем с брандмауэром и т. Д.)) НЕ совпадаютЕсли они одинаковые, то приложение зависает ровно на 1 минуту, а затем выдает исключение TimeoutException.WCF-Logging не принес ничего полезного.Вот небольшое приложение, которое демонстрирует проблему:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        var binding = new NetTcpBinding();
        var baseAddress = new Uri(@"net.tcp://localhost:4000/Test");

        ServiceHost host = new ServiceHost(typeof(TestService), baseAddress);
        host.AddServiceEndpoint(typeof(ITestService), binding, baseAddress);

        var debug = host.Description.Behaviors.Find<ServiceDebugBehavior>();
        if (debug == null)
            host.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        else
            debug.IncludeExceptionDetailInFaults = true;

        host.Open();

        var clientBinding = new NetTcpBinding();
        var testProxy = new TestProxy(clientBinding, new EndpointAddress(baseAddress));
        testProxy.Test();
    }
}

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    void Test();
}

public class TestService : ITestService
{
    public void Test()
    {
        MessageBox.Show("foo");
    }
}

public class TestProxy : ClientBase<ITestService>, ITestService
{
    public TestProxy(NetTcpBinding binding, EndpointAddress remoteAddress) :
        base(binding, remoteAddress) { }

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

Что я делаю не так?

С уважением, Pharao2k

1 Ответ

5 голосов
/ 02 января 2011

Вы положили все в одной теме. У вас не может быть клиента и сервера в одном потоке, по крайней мере, в коде такого типа.

Если вы сделаете это вместо этого, например:

    ThreadPool.QueueUserWorkItem(state =>
    {
        var clientBinding = new NetTcpBinding();
        var testProxy = new TestProxy(clientBinding, new EndpointAddress(baseAddress));
        testProxy.Test();
    });

Ваш код должен работать лучше.

PS: даже на той же машине у вас могут быть проблемы с брандмауэром - ну, это особенность, а не проблема

...