Дуплексная связь WCF не работает в приложении Metro - PullRequest
0 голосов
/ 21 февраля 2012

Не могли бы вы сказать, почему дуплексная связь с TcpTransportBindingElement не работает в моем приложении Metro?

Согласно этому документу подмножество Metro .Net Frameworkподдерживает привязку TCP.

Поэтому я написал WCF-сервер как консольное приложение.Вот исходный код:

static void Main()
{
    UiWcfSession.OnInitialize += ClientInitialize;

    var baseAddresses = new Uri("net.tcp://localhost:9000/");

    var host = new ServiceHost(typeof(UiWcfSession), baseAddresses);

    var reliableSession = new ReliableSessionBindingElement { Ordered = true, InactivityTimeout = TimeSpan.MaxValue };
    var binding =
        new CustomBinding(reliableSession, new TcpTransportBindingElement()) { ReceiveTimeout = TimeSpan.MaxValue };

    host.AddServiceEndpoint(typeof(IClientFulfillmentPipeService), binding, "");

    var metadataBehavior = new ServiceMetadataBehavior();
    host.Description.Behaviors.Add(metadataBehavior);
    var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
    host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");

    host.Open();

    Thread.CurrentThread.Join();
}

private static void ClientInitialize(int uiprocessid, string key)
{
    Debug.WriteLine("ClientInitialize");
}

, а вот клиентский код в приложении Metro:

partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void onclick(object sender, RoutedEventArgs e)
    {
        try
        {
            var ep = new EndpointAddress("net.tcp://localhost:9000/");
            var binding = new CustomBinding(new TcpTransportBindingElement());
            var ctx = new InstanceContext(new Wrapper());
            var pipeFactory = new DuplexChannelFactory<IClientFulfillmentPipeService>(ctx, binding, ep);
            IClientFulfillmentPipeService commChannel = pipeFactory.CreateChannel();

            // open up the the comm channel with a reasonable timeout...
            ((IChannel)commChannel).Open();

            commChannel.Initialize(1234, "Test");

            ((IChannel)commChannel).Close();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
}

Так что своего рода работает.Но когда я шаг за шагом захожу в отладчик в приложении Metro, он зависает и никогда не возвращается из функции commChannel.Initialize.

Почему это происходит?Чего мне не хватает?

1 Ответ

0 голосов
/ 21 февраля 2012

Оказывается, я не могу использовать синхронный клиент в Metro. Я должен использовать асинхронные вызовы. Вот почему это не сработало.

...