Сервер WCF Соединяется с клиентом автоматически, когда соединение было прервано - PullRequest
1 голос
/ 20 февраля 2010

Я использую службу WCF в моем приложении WindowsApplication ... когда я запускал приложение как на сервере, так и на клиенте, сервер отключил соединение через несколько минут .... Как мне автоматически повторно подключить клиент, когда соединение было прервано ..

Это мой код клиента:

    public void connecttoserver()
    {
        D:
        try
        {

        EndpointAddress ea = new EndpointAddress(@"net.tcp://10.0.3.33:2222/ClsPCMain");
        EndpointAddress ea = new EndpointAddress(StrAddress);
        NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, false);

        binding.MaxBufferPoolSize = Int32.MaxValue;
        binding.MaxReceivedMessageSize = Int32.MaxValue;
        binding.PortSharingEnabled = true;
        binding.ReceiveTimeout = TimeSpan.MaxValue;
        binding.SendTimeout = TimeSpan.MaxValue;
        binding.OpenTimeout = TimeSpan.MaxValue;
        binding.CloseTimeout = TimeSpan.MaxValue;
        binding.MaxReceivedMessageSize = Int32.MaxValue;
        binding.MaxBufferPoolSize = Int32.MaxValue;
        binding.MaxConnections = Int16.MaxValue;
        binding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
        binding.ReaderQuotas.MaxBytesPerRead = Int32.MaxValue;
        binding.ReaderQuotas.MaxDepth = Int32.MaxValue;
        binding.ReaderQuotas.MaxNameTableCharCount = Int32.MaxValue;
        binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
        binding.Security.Mode = SecurityMode.None;
        ChannelFactory<InterfaceClass.IService> Client = new ChannelFactory<InterfaceClass.IService>(binding,ea);

            InterfaceClass.IService serviceobj = Client.CreateChannel(ea);


            clsStatus.connectstatus = false;






            ClsPC objclsPc = serviceobj.PCInfoMethod(Environment.UserName, Environment.UserDomainName, Dns.GetHostName(), Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString());

            if (objclsPc.imageid == 1)
            {


                clsStatus.FullSizeImage = true;
                clsStatus.ThumbnailImage = false;
            }
            else
            {
                clsStatus.ThumbnailImage = true;
                clsStatus.FullSizeImage = false;

            }
        Client.Close();
        Client=null;
            //serviceobj = null;


        }

        catch (Exception ex)
        {
            logobj.Write(ex);

} }

Это код моего сервера:

    public clsHostService()
    {

        string StrAddress = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "url2.txt");
        ServiceHost host = new ServiceHost(typeof(clsService));
        NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, false);
        ServiceEndpoint endpointinfo = host.AddServiceEndpoint(typeof(IService), binding, StrAddress);

        endpointinfo.Binding.CloseTimeout = TimeSpan.MaxValue;
        endpointinfo.Binding.OpenTimeout = TimeSpan.MaxValue;
        endpointinfo.Binding.ReceiveTimeout = TimeSpan.MaxValue;
        endpointinfo.Binding.SendTimeout = TimeSpan.MaxValue;



        XmlDictionaryReaderQuotas BindingQuota = binding.ReaderQuotas;
        BindingQuota.MaxArrayLength = Int32.MaxValue;
        BindingQuota.MaxBytesPerRead = Int32.MaxValue;
        BindingQuota.MaxDepth = Int32.MaxValue;

        binding.MaxConnections = Int16.MaxValue;
        binding.MaxBufferPoolSize = Int32.MaxValue;
        binding.MaxBufferSize = Int32.MaxValue;
        binding.MaxReceivedMessageSize = Int32.MaxValue;
        binding.CloseTimeout = TimeSpan.MaxValue;
        binding.OpenTimeout = TimeSpan.MaxValue;
        binding.ReceiveTimeout = TimeSpan.MaxValue;
        binding.SendTimeout = TimeSpan.MaxValue;

        ServiceThrottlingBehavior throttlingBehavior =new ServiceThrottlingBehavior();
        throttlingBehavior.MaxConcurrentCalls = Int32.MaxValue;
        throttlingBehavior.MaxConcurrentInstances = Int32.MaxValue;
        throttlingBehavior.MaxConcurrentSessions = Int32.MaxValue;
        host.Description.Behaviors.Add(throttlingBehavior);




        host.Open();
        Console.WriteLine("Server Started");

        Console.ReadLine();

    }

Теперь, как я должен автоматически подключаться к клиенту, когда сервер прерывает соединение? Кто-нибудь сказать мне решение этой проблемы ... Заранее спасибо .....

Ответы [ 2 ]

2 голосов
/ 20 февраля 2010

Я использую что-то вроде этого:

//Somewhere in the main
ConfigureWcf();
ConnectToServer();
//...

void ConnectToServer()
{
  myService = new ServiceReference.ServiceClient(context);
  myService.Open();
  myService.InnerChannel.UnknownMessageReceived += InnerChannel_UnknownMessageReceived;
  myService.InnerChannel.Closed += InnerChannel_Closed;
}

void StartConnecting()
{
   //use 5 attempts to connect to server
   ConnectToServer();
}

void InnerChannel_Closing(object sender, EventArgs e)
{
  //Connection to server closed!
  //Write to log
  StartConnecting(); 
}
1 голос
/ 20 февраля 2010

Я не совсем понимаю ваш вопрос, боюсь, ваше приложение Winforms содержит службу или это клиент, вызывающий службу WCF ??

WCF обычно не использует концепцию постоянной связи между клиентом и сервером.

Клиент создает клиентский прокси-сервер, который вызывает методы, предоставляемые сервером. По сути, каждый вызов не зависит от всех остальных - между клиентом и сервером существует соединение только на время вызова. Соединение не всегда установлено - оно существует только тогда, когда действительно происходит вызов.

Так что я не совсем понимаю, что вы хотите «переподключить» - во-первых, не всегда включено соединение.

Что может произойти, если исключение произойдет на стороне сервера и не будет перехвачено и обработано должным образом, то прокси на стороне клиента может стать недействительным. В терминах WCF «канал» между клиентом и сервером был «поврежден», например, стал непригодным для использования. Если бы вам пришлось снова вызывать сервер с прокси на стороне клиента в неисправном состоянии, вы получите исключение на стороне клиента.

Вы можете проверить состояние неисправного канала на клиентском прокси, прежде чем совершать вызов с помощью этого кода:

if(client.State == CommunicationState.Faulted)
{
    client = new YourServiceClient();            
}

Если канал действительно неисправен, вам нужно заново создать прокси-сервер, и вы должны вернуться в бизнес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...