C# WCF - aplikacja się zacina

0

Próbuje napisać prosty program tzw. chat application przy użyciu WCF i w momencie kiedy klient łaczy się z serwerem, klient przestaje reagować, aplikacja się zacina i nie da się nic zrobić. Próbowałem wyłaczyć zapore systemowa ale nic to nie dało. Czy aby WCF działał trzeba gdzieś odblokować jakieś porty? Dodam tylko że aplikacja jest testowana na jednym komputerze i uruchamiana jako administrator.

0

No to chyba oczywiste, że powinieneś mieć odblokowany port, na którym działa Twój czat. Tylko związku z WCF to nie ma.

Uruchom aplikację z debugerem, i zobacz, czy nie leci jakiś wyjątek.

0

Zacina? Może masz gdzieś w głównym wątku while(true)?

0

Wszystko co znajduję w internecie nie pomaga. Mam wyłaczona zapore, odblokowane porty a mimo to aplikacja nie może połaczyc się z serwerem. Skopiowałem nawet cały kod z tutoriala i nie chce się połaczyc, wiec chyba nie ma błędów w kodzie.
Program działa do momentu łaczenia się z serwerem i potem wisi i niereaguje na nic, a na debugerze po minucie wyrzuca wyjatek System.TimeoutException.

using System;
using System.ServiceModel;
using System.Collections.Generic;

namespace Host
{
    [ServiceContract]
    public interface IChatClient
    {
        [OperationContract(IsOneWay = true)]
        void ReciveMessagee(string user, string message);
    }

    [ServiceContract(CallbackContract = typeof(IChatClient))]
    public interface IChatService
    {
        [OperationContract(IsOneWay = true)]
        void Join(string username);
        [OperationContract(IsOneWay = true)]
        void SendMessage(string message);
    }
    
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
    public class ChatService : IChatService
    {
        Dictionary<IChatClient, string> _users = new Dictionary<IChatClient, string>();
        public void Join(string username)
        {
            var connection = OperationContext.Current.GetCallbackChannel<IChatClient>();
            _users[connection] = username;
        }

        public void SendMessage(string message)
        {
            var connection = OperationContext.Current.GetCallbackChannel<IChatClient>();
            string user;
            if (!_users.TryGetValue(connection, out user))
                return;
            foreach (var other in _users.Keys)
            {
                if (other == connection)
                    continue;
                other.ReciveMessagee(user, message);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(ChatService));
            
            host.Open();
            Console.WriteLine("Service is ready");
            Console.ReadLine();
            host.Close();
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.serviceModel>
    <services>
      <service name="Host.ChatService">
        <endpoint address=""
                  binding="wsDualHttpBinding"
                  contract="Host.IChatService">
          
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9090"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>
using System;
using System.ServiceModel;

namespace Client
{
    public class MyCallback : Proxy.IChatServiceCallback
    {
        public void ReciveMessagee(string user, string message)
        {
            Console.WriteLine("{0}:{1}", user, message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            InstanceContext context = new InstanceContext(new MyCallback());
            Proxy.ChatServiceClient server = new Proxy.ChatServiceClient(context);

            Console.WriteLine("Enter UserName");
            var username = Console.ReadLine();
            server.Join(username);

            Console.WriteLine();
            Console.WriteLine("Enter Message");
            Console.WriteLine("Press Q to Exit");

            var message = Console.ReadLine();

            while (message != "Q")
            {
                if (!string.IsNullOrEmpty(message))
                    server.SendMessage(message);

                message = Console.ReadLine();
            }
        }
    }
}
0

Problem rozwiazany, okazało się że VPN blokował połaczenie...

0

No to nie do końca rozwiązny problem, bo to, że VPN coś blokował to jedno, ale tak poza tym, to klient w takiej sytuacji nie powinien przestawać reagować, tylko ładnie wyświetlić informacje o błędzie.

0

Racja, powinienem dodać jeszcze try catch. Człowiek się uczy na błędach, dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1