Nano Hash - криптовалюты, майнинг, программирование

Нужен сервер для вызова клиентской функции (БЕЗ ВЫЗОВА!)

Я проводил некоторые исследования по этому поводу и ничего не получил. У меня есть сервер и клиент.

Мой клиент запрашивает сервер, и сервер выполняет некоторые обратные вызовы. Это прекрасно работает. Но теперь есть некоторые функции клиентов, которые мне нужно вызывать с сервера, и они не являются результатом вызова клиента, поэтому я не могу использовать там обратные вызовы. Я использую WCF и .net 4.0.

Какие-либо предложения?

КЛИЕНТ:

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Runtime.Serialization;
using System.IO;
using System.Collections;

namespace WCFClient
{
    [ServiceContract(SessionMode = SessionMode.Required,
      CallbackContract = typeof(ICallbacks))]
    public interface IMessageHandler
    {
        [OperationContract]
        void HandleMessage();
    }

    public interface ICallbacks
    {
        [OperationContract(IsOneWay = true)]
        void QueuePaths_Callback(string cPath, string EPath, string RPath, string IPath, string OPath);
    }

    public class Callbacks : ICallbacks
    {
        public void QueuePaths_Callback(string cPath)
        {
            Console.WriteLine("QueuePaths_Callback: " + cPath);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Callbacks myCallbacks = new Callbacks();

            DuplexChannelFactory<IMessageHandler> pipeFactory =
               new DuplexChannelFactory<IMessageHandler>(
                  myCallbacks,
                  new NetNamedPipeBinding(),
                  new EndpointAddress(
                     "net.pipe://localhost/PipeReverse"));

            IMessageHandler pipeProxy =
              pipeFactory.CreateChannel();

            while (true)
            {
                string str = Console.ReadLine();
                pipeProxy.HandleMessage();//send the type for example
            }
        }

        public void IWANTTOCALLTHISFROMSERVER()
        { }
    }
}

СЕРВЕР:

namespace WCFServer
{

    [ServiceContract(SessionMode = SessionMode.Required,
       CallbackContract = typeof(ICallbacks))]
    public interface IMessageHandler
    {
        [OperationContract]
        void HandleMessage();
    }

    public interface ICallbacks
    {
        [OperationContract(IsOneWay = true)]
        void QueuePaths_Callback(string cPath);
    }
    public class StringReverser : IMessageHandler
    {
        public void HandleMessage()//handle the type and do the request
        {
            ICallbacks callbacks = OperationContext.Current.GetCallbackChannel<ICallbacks>();
            callbacks.QueuePaths_Callback("path1");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(
              typeof(StringReverser),
              new Uri[]{
          new Uri("net.pipe://localhost")
        }))
            {

                host.AddServiceEndpoint(typeof(IMessageHandler),
                  new NetNamedPipeBinding(),
                  "PipeReverse");
                host.
                host.Open();

                Console.WriteLine("Service is available. " +
                  "Press <ENTER> to exit.");
                Console.ReadLine();
                //BLA BLA BLA 
                //CALL IWANTTOCALLTHISFROMSERVER();
                host.Close();
            }
        }
    }
}
29.07.2013

  • Итак, вы хотите сообщить клиенту, что что-то произошло на сервере? 29.07.2013
  • Взгляните на ASP.NET SignalR. 29.07.2013

Ответы:


1

Если вы хотите сообщить клиенту, что на сервере что-то произошло, вам нужна Duplex Service. .

В полном .net у вас есть 2 варианта привязки:

  • netTcpBinding
  • wsDualHttpBinding

netTcpBinding намного лучше, так как он не требует от клиента открытия порта (wsDualHttpBinding требует этого).

Честно говоря, лучшая привязка — это PollingDuplexHttpBinding, доступный только для Silverlight. Однако не так уж сложно эмулировать его с помощью basicHttpBinding.

Тема довольно широкая, поэтому я рекомендую читать дальше.

29.07.2013
  • Я уже использовал DuplexChannelFactory‹IMessageHandler› = new DuplexChannelFactory‹IMessageHandler›(myCallbacks, new NetNamedPipeBinding(), new EndpointAddress(net.pipe://localhost/PipeReverse)); 29.07.2013
  • Есть ли способ сделать это таким образом? 29.07.2013
  • @ AnnArbor87 Хорошо, а у вас есть CallbackContract и все такое? Может быть, вы должны опубликовать свой код и сказать, что не работает. 29.07.2013
  • Я думаю, может быть, я не expain это правильно. Я НЕ хочу обратного звонка. Я НЕ ХОЧУ, чтобы КЛИЕНТ вызывал сервер, а СЕРВЕР выполнял обратный вызов. Я ХОЧУ, чтобы СЕРВЕР вызывал функцию от клиента. Точно так же мой клиент вызывает сервер 29.07.2013
  • @ AnnArbor87 Обратный вызов — это стандартный способ достижения такой функциональности — в чем проблема? Единственным ограничением является то, что клиент должен сделать первый звонок. Если вам не нужен обратный вызов, клиент должен действовать как сервер и предоставлять свою собственную службу. 29.07.2013
  • Вот чего я не хочу, я не хочу, чтобы клиент звонил первым. Я хочу, чтобы служба могла инициировать это. 29.07.2013
  • @ AnnArbor87, поэтому клиент должен предоставить услугу - она ​​может быть размещена самостоятельно, однако сервер должен иметь возможность обращаться к клиенту (клиенту нужен адресуемый IP-адрес и открытый порт). Клиент просто становится сервером, но поскольку служба размещается самостоятельно, установка iis не требуется. 29.07.2013
  • Любой фрагмент кода, чтобы помочь мне? Значит, мне нужно создать канал на сервере и хост на клиенте? так же, как у меня сейчас, но по-другому? Спасибо, я немного потерялся 29.07.2013
  • давайте продолжим это обсуждение в чате 29.07.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..