C# WCF - aplikacja się zacina

Odpowiedz Nowy wątek
2020-01-12 18:27

Rejestracja: 1 miesiąc temu

Ostatnio: 1 dzień temu

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.

edytowany 1x, ostatnio: Ktos, 2020-01-13 11:10

Pozostało 580 znaków

2020-01-13 00:49
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2020-01-13 17:59

Rejestracja: 8 lat temu

Ostatnio: 1 miesiąc temu

0

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

Pozostało 580 znaków

2020-01-13 19:14

Rejestracja: 1 miesiąc temu

Ostatnio: 1 dzień temu

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();
            }
        }
    }
}
edytowany 1x, ostatnio: Jerry99, 2020-01-13 19:15

Pozostało 580 znaków

2020-01-14 16:45

Rejestracja: 1 miesiąc temu

Ostatnio: 1 dzień temu

0

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

edytowany 1x, ostatnio: Jerry99, 2020-01-14 16:45

Pozostało 580 znaków

2020-01-14 16:48
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2020-01-14 16:58

Rejestracja: 1 miesiąc temu

Ostatnio: 1 dzień temu

0

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

Pozostało 580 znaków

Odpowiedz

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