Neuroware
@Neuroware
Программист в свободное от работы время

Правильно ли я понимаю WCF?

Нашел код сервиса на WCF, но его логику не могу понять, правильно ли я понимаю, что если клиентов будет скажем 10 и 1 из них вызовет proxy.ProcessData() то у каждого из 10 будет вызвана процедура NotifyClient() и в консоле будет выведено "Notification from Server"?
Сомнение вызвано тем что в реализации сервиса я не вижу ни слова о списках или каких либо итераторах или перечислителях. Выглядит так как будто NotifyClient() будет вызвано только у того кто вызывал proxy.ProcessData, тогда не понятно зачем вообще такой костыль нужен.
Using WCF you can use duplex named pipes
// Create a contract that can be used as a callback
public interface IMyCallbackService
{
    [OperationContract(IsOneWay = true)]
    void NotifyClient();
}

// Define your service contract and specify the callback contract
[ServiceContract(CallbackContract = typeof(IMyCallbackService))]
public interface ISimpleService
{
    [OperationContract]
    string ProcessData();
}
Implement the Service
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class SimpleService : ISimpleService
{
    public string ProcessData()
    {
        // Get a handle to the call back channel
        var callback = OperationContext.Current.GetCallbackChannel<IMyCallbackService>();

        callback.NotifyClient();
        return DateTime.Now.ToString();
    }
}
Host the Service
class Server
{
    static void Main(string[] args)
    {
        // Create a service host with an named pipe endpoint
        using (var host = new ServiceHost(typeof(SimpleService), new Uri("net.pipe://localhost")))
        {
            host.AddServiceEndpoint(typeof(ISimpleService), new NetNamedPipeBinding(), "SimpleService");
            host.Open();

            Console.WriteLine("Simple Service Running...");
            Console.ReadLine();

            host.Close();
        }
    }
}
Create the client application, in this example the Client class implements the call back contract.
class Client : IMyCallbackService
{
    static void Main(string[] args)
    {
        new Client().Run();
    }

    public void Run()
    {
        // Consume the service
        var factory = new DuplexChannelFactory<ISimpleService>(new InstanceContext(this), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/SimpleService"));
        var proxy = factory.CreateChannel();

        Console.WriteLine(proxy.ProcessData());
    }

    public void NotifyClient()
    {
        Console.WriteLine("Notification from Server");
    }
}
  • Вопрос задан
  • 955 просмотров
Решения вопроса 1
artem_b89
@artem_b89
Сетевой бездельник
Выглядит так как будто NotifyClient() будет вызвано только у того кто вызывал proxy.ProcessData, тогда не понятно зачем вообще такой костыль нужен.

Так и есть. А костыль такой нужен потому, что это такой "Hello World"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы